From 46b61ce1e08b250214e5a0ff07a7dc292ca6d790 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Tue, 29 Apr 2014 18:13:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=98=BF=E5=B0=94=E6=B3=B0?= =?UTF-8?q?=E5=8D=A1=E6=B5=8B=E8=AF=95=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hgignore | 3 +- .../Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp | 162 +++++++++ .../Base/Interfac/Msi/Hsi/ART/ART_PCI8622.h | 24 ++ PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h | 336 ++++++++++++++++++ .../Base/Interfac/Msi/Hsi/ART/PCI8622_32.lib | Bin 0 -> 14186 bytes .../Base/Interfac/Msi/Hsi/ART/PCI8622_64.lib | Bin 0 -> 13178 bytes PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.lib | Bin 0 -> 33776 bytes .../Tools/UsbUtility/Release/UtilityDebug.Log | 1 + .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 65 ++-- .../UsbUtility/UsbUtil/So7_Art_PCI8622.cpp | 56 +++ .../UsbUtility/UsbUtil/So7_Art_PCI8622.h | 25 ++ .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 31 +- .../Hsi/Tools/UsbUtility/UsbUtil/So7_Option.h | 1 + .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 9 +- .../UsbUtil/Usb_Util.vcxproj.filters | 15 + .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 10 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 112640 -> 114688 bytes .../Msi/Hsi/Videocard/SV4000E/DXMediaCap.lib | Bin 0 -> 20090 bytes .../Msi/Hsi/Videocard/SV4000E/dataAcq.lib | Bin 0 -> 5252 bytes 19 files changed, 711 insertions(+), 27 deletions(-) create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622_32.lib create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622_64.lib create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.lib create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Art_PCI8622.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Art_PCI8622.h create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/DXMediaCap.lib create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/dataAcq.lib diff --git a/.hgignore b/.hgignore index 4b380c4..39594d2 100644 --- a/.hgignore +++ b/.hgignore @@ -25,7 +25,6 @@ PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/LITE/Utility_Lite/Release *.log *.txt *.db -*.lib PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/ PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/ PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/ReleaseSO7/ @@ -39,3 +38,5 @@ PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/Debug PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/Release PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Debug PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Win32TestDll/Release +PcDmis/Base/Interfac/Msi/Hsi/Videocard/TC4000/V6.0 +PcDmis/Base/Interfac/Msi/Hsi/Videocard/TC4000/V7.5 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp b/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp new file mode 100644 index 0000000..b13f479 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp @@ -0,0 +1,162 @@ +#include "StdAfx.h" +#include +#include +#include "ART_PCI8622.h" + +#define MAX_AD_CHANNELS 4 +#define SEGMENT_COUNT 32 +#define HALF_SIZE_WORDS 4096 + + +CART_PCI8622::CART_PCI8622() +{ + +} + +CART_PCI8622::~CART_PCI8622() +{ + +} +//======================================== +BOOL CART_PCI8622::Init() +{ + return TRUE; +} +//======================================== +BOOL CART_PCI8622::Exit() +{ + return TRUE; +} +//======================================== +BOOL CART_PCI8622::GetData() +{ + BOOL rStatus(TRUE); +#ifdef _RELEASE_FULL_VERSION + int InputRange(0); + int SelectInputRange(void); + WORD ADBuffer[SEGMENT_COUNT][HALF_SIZE_WORDS]; // 分配缓冲区(存储原始数据) + ULONG SegmentID = 0; + + HANDLE hDevice; + int DeviceLgcID; + + PCI8622_PARA_AD ADPara; // 硬件参数 + PCI8622_STATUS_DMA DMAStatus; // DMA状态参数 + + int Index(0); + + int nADChannel = 0; + WORD ADData(0); + float fVolt(0); + + DeviceLgcID = 0; + hDevice = PCI8622_CreateDevice(DeviceLgcID); // 创建设备对象 + if(hDevice == INVALID_HANDLE_VALUE) + { + rStatus=FALSE; + return rStatus; // 如果创建设备对象失败,则返回 + } + + memset(&ADPara, 0x00, sizeof(ADPara)); // 将各项参数复位至确定值0(强烈建议) + + // 预置硬件参数 + ADPara.ADMode = PCI8622_ADMODE_SEQUENCE; // AD模式为连续模式 + ADPara.FirstChannel = 1; // 首通道 + ADPara.LastChannel = 2; // 末通道 + ADPara.Frequency = 10000; // 采样频率(Hz) + ADPara.GroupInterval = 50; // 组间间隔(uS) + ADPara.LoopsOfGroup = 1; // 组内各通道点数 + ADPara.Gains = PCI8622_GAINS_1MULT; + ADPara.InputRange = InputRange; // 模拟量输入量程范围 + + ADPara.TriggerMode = PCI8622_TRIGMODE_SOFT; // 触发模式为软件触发 + ADPara.TriggerType = PCI8622_TRIGTYPE_EDGE; // 触发类型为边沿触发 + ADPara.TriggerDir = PCI8622_TRIGDIR_NEGATIVE; // 触发方向为负向 + ADPara.TrigWindow = 40; // 触发灵敏度 + + ADPara.ClockSource = PCI8622_CLOCKSRC_IN; // 时钟源选用板内时钟源 + ADPara.bClockOutput = FALSE; // 禁止时钟输出 + ADPara.GroundingMode = PCI8622_GNDMODE_SE; // 单端方式(SE:Single end) + ADPara.TimeoutForNpt = 10; // 在非空方式下,设置超时时间为10秒钟(只在非空查询方式下有效) + + HANDLE hDmaEvent = PCI8622_CreateSystemEvent(); + if(!PCI8622_InitDeviceDmaAD( hDevice, hDmaEvent, &ADBuffer[0][0], 4096, SEGMENT_COUNT, HALF_SIZE_WORDS, &ADPara)) // 初始化硬件 + { + rStatus=FALSE; + goto ExitRead0; + } + + PCI8622_StartDeviceDmaAD(hDevice); // 启动设备 + bool bWait(true); + while(bWait) // 查询当前物理缓冲区数据是否已准备就绪 + { + if(WaitForSingleObject (hDmaEvent, 100)==WAIT_OBJECT_0) + bWait=false; // 等待DMA事件 + } + + if(!PCI8622_GetDevStatusDmaAD(hDevice, &DMAStatus)) + { + rStatus=FALSE; + goto ExitRead0; + } + + if(DMAStatus.bBufferOverflow) + { + rStatus=FALSE; + } + + for(SegmentID=0; SegmentID ADPara.LastChannel) + { + nADChannel = ADPara.FirstChannel; + } + } + } + + if(!PCI8622_SetDevStatusDmaAD(hDevice, SegmentID)) + { + rStatus=FALSE; + goto ExitRead0; + } + } // end of for(SegmentID=0; SegmentID 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "PCI8622.h" +//====================================================================================== +class CART_PCI8622 +{ +protected: + +public: + CART_PCI8622(); + ~CART_PCI8622(); + + BOOL Init(); + BOOL Exit(); + BOOL GetData(); + +}; +#endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h b/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h new file mode 100644 index 0000000..78cea71 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h @@ -0,0 +1,336 @@ +#ifndef _PCI8622_DEVICE_ +#define _PCI8622_DEVICE_ +//#################### AD硬件参数PCI8622_PARA_AD定义 ##################### +// 用于AD采样的实际硬件参数 +typedef struct _PCI8622_PARA_AD +{ + LONG ADMode; // AD模式选择(连续/分组方式) + LONG FirstChannel; // 首通道[0,31] + LONG LastChannel; // 末通道[0,31],要求末通道必须大于或等于首通道 + LONG Frequency; // 采集频率,单位为Hz, [1, 250000] + LONG GroupInterval; // 分组时的组间间隔(单位:微秒)[1, 419430] + LONG LoopsOfGroup; // 组内循环次数[1, 255] + LONG Gains; // 增益设置 + LONG InputRange; // 模拟量输入量程范围 + LONG TriggerMode; // 触发模式选择 + LONG TriggerType; // 触发类型选择(边沿触发/脉冲触发) + LONG TriggerDir; // 触发方向选择(正向/负向触发) + LONG TrigWindow; // 触发灵敏窗[1, 65535], 单位25纳秒 + LONG ClockSource; // 时钟源选择(内/外时钟源) + LONG bClockOutput; // 允许时钟输出到CLKOUT,=TRUE:允许时钟输出, =FALSE:禁止时钟输出 + LONG GroundingMode; // 接地方式(单端或双端选择) + LONG TimeoutForNpt; // 非空查询方式下的超时时间,单位秒,取值范围为[0, 3600] +} PCI8622_PARA_AD, *PPCI8622_PARA_AD; + +//*********************************************************** +// AD硬件参数PCI8622_PARA_AD中的ADMode所使用工作模式选项 +const long PCI8622_ADMODE_SEQUENCE = 0x00; // 连续采样 +const long PCI8622_ADMODE_GROUP = 0x01; // 分组采样 + +//*********************************************************** +// AD硬件参数PCI8622_PARA_AD中的InputRange模拟量输入范围所使用的选项 +const long PCI8622_INPUT_N10000_P10000mV= 0x00; // ±10000mV +const long PCI8622_INPUT_N5000_P5000mV = 0x01; // ±5000mV +const long PCI8622_INPUT_N2500_P2500mV = 0x02; // ±2500mV +const long PCI8622_INPUT_0_P10000mV = 0x03; // 0~10000mV +const long PCI8622_INPUT_0_P5000mV = 0x04; // 0~5000mV + +//*********************************************************** +// AD参数PCI8622_PARA_AD中的Gains使用的硬件增益选项(使用AD8250放大器) +const long PCI8622_GAINS_1MULT = 0x00; // 1倍增益 +const long PCI8622_GAINS_2MULT = 0x01; // 2倍增益 +const long PCI8622_GAINS_5MULT = 0x02; // 5倍增益 +const long PCI8622_GAINS_10MULT = 0x03; // 10倍增益 + +//*********************************************************** +// AD硬件参数PCI8622_PARA_AD中的TriggerMode成员变量所使用触发模式选项 +const long PCI8622_TRIGMODE_SOFT = 0x00; // 软件触发(属于内触发) +const long PCI8622_TRIGMODE_POST = 0x01; // 硬件后触发(属于外触发) + +// AD硬件参数PCI8622_PARA_AD中的TriggerType触发类型所使用的选项 +const long PCI8622_TRIGTYPE_EDGE = 0x00; // 边沿触发 +const long PCI8622_TRIGTYPE_PULSE = 0x01; // 脉冲触发(电平) + +//*********************************************************** +// AD硬件参数PCI8622_PARA_AD中的TriggerDir触发方向所使用的选项 +const long PCI8622_TRIGDIR_NEGATIVE = 0x00; // 负向触发(低脉冲/下降沿触发) +const long PCI8622_TRIGDIR_POSITIVE = 0x01; // 正向触发(高脉冲/上升沿触发) +const long PCI8622_TRIGDIR_POSIT_NEGAT = 0x02; // 正负向触发(高/低脉冲或上升/下降沿触发) + +//*********************************************************** +// AD硬件参数PCI8622_PARA_AD中的ClockSource时钟源所使用的选项 +const long PCI8622_CLOCKSRC_IN = 0x00; // 内部时钟 +const long PCI8622_CLOCKSRC_OUT = 0x01; // 外部时钟(CLKIN) + +//*********************************************************** +// AD参数(PCI8622_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项 +const long PCI8622_GNDMODE_SE = 0x00; // 单端方式(SE:Single end) +const long PCI8622_GNDMODE_DI = 0x01; // 双端方式(DI:Differential) + +//************************************************************************************* +// 用于AD采样的实际硬件参数 +typedef struct _PCI8622_STATUS_AD +{ + LONG bNotEmpty; // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空 + LONG bHalf; // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下 + LONG bDynamic_Overflow; // 板载FIFO存储器的动态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出 + LONG bStatic_Overflow; // 板载FIFO存储器的静态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出 + LONG bConverting; // AD是否正在转换, =TRUE:表示正在转换, =FALS表示转换完成 + LONG bTriggerFlag; // 触发标志, =TRUE表示触发事件发生, =FALSE表示触发事件未发生 + LONG nRemainWords; // 在FIFO中乘余的数据点数 +} PCI8622_STATUS_AD, *PPCI8622_STATUS_AD; + +const int PCI8622_MAX_SEGMENT_COUNT = 64; +typedef struct _PCI8622_STATUS_DMA +{ + LONG iCurSegmentID; // 当前段缓冲ID,表示DMA正在传输的缓冲区段 + LONG bSegmentSts[PCI8622_MAX_SEGMENT_COUNT]; // 各个缓冲区的新旧状态,=1表示该相应缓冲区数据为新,否则为旧 + LONG bBufferOverflow; // 返回溢出状态 +} PCI8622_STATUS_DMA, *PPCI8622_STATUS_DMA; + +//*********************************************************** +// 用于计数器的参数结构 +typedef struct _PCI8622_PARA_CNT +{ + LONG FunctionMode; // 功能模式, 0:计数器模式COUNTER, 2:脉冲发生器模式 + LONG ClockSource; // 时钟源选择 + LONG GateMode; // 门控模式 + LONG bEnableBuffer; // 缓冲计数使能, 0: 禁止缓冲计数,1: 允许缓冲计数 + LONG OutputDir; // 计数输出电平方向 + LONG bCoutinue; // 溢出后是否继续计数 + LONG OutputType; // 定时器脉冲发生方式下有效,输出波形类型。 +} PCI8622_PARA_CNT, *PPCI8622_PARA_CNT; + +//*********************************************************** +// 硬件参数PCI8622_PARA_CNT中的FunctionMode功能模式选项 +const long PCI8622_FUNCMODE_COUNTER = 0x00; // 计数器模式 +const long PCI8622_FUNCMODE_TIMER = 0x01; // 脉冲发生器模式 + +//*********************************************************** +// 硬件参数PCI8622_PARA_CNT中的ClockSource功能模式选项 +const long PCI8622_CLOCKSRC_LOCAL_CLK = 0x00; // 板卡局部分频时钟(对40M晶振分频而得,由SetLocalCLKFreq设定) +const long PCI8622_CLOCKSRC_CLOCK_IN = 0x01; // 外部时钟信号源输入 + +//*********************************************************** +// 硬件参数PCI8622_PARA_CNT中的ClockDir时钟方向选项 +const long PCI8622_CLOCKDIR_POSTIVE = 0x00; // 上升沿计数 +const long PCI8622_CLOCKDIR_NEGATIVE = 0x01; // 下降沿计数 + +//*********************************************************** +// 硬件参数PCI8622_PARA_CNT中的GateMode在门控模式选项 +const long PCI8622_GATEMODE_UNUSE_0 = 0x00; // COUNTER:不使用门控信号(适用于简单事件计数) +// TIMER:不使用GATE的单次脉冲发生(适用于单次脉冲发生器) +const long PCI8622_GATEMODE_RISING_1 = 0x01; // COUNTER:GATE上边沿触发计数,后续边沿无效 +// TIMER:GATE上边沿单次触发脉冲发生(适用于单次触发单脉冲发生器) +const long PCI8622_GATEMODE_FALLING_2 = 0x02; // COUNTER:GATE下边沿触发,后续边沿无效 +// TIMER:GATE下边沿单次触发脉冲发生(适用于单次触发单脉冲发生器) +const long PCI8622_GATEMODE_POSITIVE_3 = 0x03; // COUNTER:高电平有效(适用于门控事件计数) +// TIMER:GATE上边沿重复触发脉冲发生(适用于重复触发单脉冲发生器) +const long PCI8622_GATEMODE_NEGATIVE_4 = 0x04; // COUNTER:低电平有效(适用于门控事件计数) +// TIMER:GATE下边沿重复触发脉冲发生(适用于重复触发单脉冲发生器) +const long PCI8622_GATEMODE_RSTART_FSTOP_5 = 0x05; // COUNTER:上边沿触发计数、下边沿停止计数(适用于单脉冲宽度测量) +// TIMER:GATE上边沿单次触发连续脉冲串发生器 +const long PCI8622_GATEMODE_FSTART_RSTOP_6 = 0x06; // COUNTER:下边沿触发计数、上边沿停止计数(适用于单脉冲宽度测量) +// TIMER:GATE下边沿单次触发连续脉冲串发生器 +const long PCI8622_GATEMODE_PSTART_PSTOP_7 = 0x07; // COUNTER:上边沿触发计数、下一个上边沿停止计数(适用于单周期测量) +// TIMER:GATE高电平允许连续脉冲串发生器 +const long PCI8622_GATEMODE_NSTART_NSTOP_8 = 0x08; // COUNTER:下边沿触发计数、下一个下边沿停止计数(适用于单周期测量) +// TIMER:GATE低电平允许连续脉冲串发生器 + +// 硬件参数PCI8622_PARA_CNT中的OutputDir在输出方向选项 +const long PCI8622_OUTPUTDIR_NEGATIVE = 0x00; // 禁止计数情况下,输出低电平有效 +const long PCI8622_OUTPUTDIR_POSITIVE = 0x01; // 禁止计数情况下,输出高电平有效 + +//*********************************************************** +// 用户函数接口 +#ifndef _PCI8622_DRIVER_ +#define DEVAPI __declspec(dllimport) +#else +#define DEVAPI __declspec(dllexport) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + //######################## 常规通用函数 ################################# + // 适用于本设备的最基本操作 + HANDLE DEVAPI FAR PASCAL PCI8622_CreateDevice(int DeviceID = 0); // 创建设备对象 + int DEVAPI FAR PASCAL PCI8622_GetDeviceCount(HANDLE hDevice); // 取得设备总台数 + BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceCurrentID(HANDLE hDevice, PLONG DeviceLgcID, PLONG DevicePhysID); + BOOL DEVAPI FAR PASCAL PCI8622_ListDeviceDlg(HANDLE hDevice); // 列表系统当中的所有的该PCI设备 + BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDevice(HANDLE hDevice); // 关闭设备,禁止传输,且释放资源 + + //####################### AD数据读取函数 ################################# + // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备 + // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取 + // AD数据两个函数便能轻松高效地实现高速、连续的数据采集 + BOOL DEVAPI FAR PASCAL PCI8622_GetDevTriggerPos( // 取得触发位置 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + PULONG nTriggerPos); // 取得触发位置值 + // AD程序查询方式函数 + BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceProAD( // 初始化设备,当返回TRUE后,设备即准备就绪. + HANDLE hDevice, // 设备对象,它由CreateDevice函数创建 + PPCI8622_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 + + BOOL DEVAPI FAR PASCAL PCI8622_StartDeviceProAD( // 在初始化之后,启动设备 + HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 + + BOOL DEVAPI FAR PASCAL PCI8622_ReadDeviceProAD_Npt( // 当AD标志有效时,用此函数读取设备上的AD数据(程序非空方式) + HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 + WORD ADBuffer[], // 接受原始AD数据的用户缓冲区 + LONG nReadSizeWords, // 相对于偏位点后读入的数据长度(字) + PLONG nRetSizeWords); // 返回实际读取的长度(字) + + BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusProAD( // 在AD采样过程中取得设备的各种状态,返回值表示函数是否成功 + HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 + PPCI8622_STATUS_AD pADStatus); // AD的各种信息结构体 + + BOOL DEVAPI FAR PASCAL PCI8622_ReadDeviceProAD_Half( // 当AD标志有效时,用此函数读取设备上的AD数据(程序半满方式) + HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 + WORD ADBuffer[], // 接受原始AD数据的用户缓冲区 + LONG nReadSizeWords, // 相对于偏位点后读入的数据长度(字) + PLONG nRetSizeWords); // 返回实际读取的长度(字) + + BOOL DEVAPI FAR PASCAL PCI8622_StopDeviceProAD( // 在启动设备之后,暂停设备 + HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 + + BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceProAD( // 关闭AD设备,禁止传输,且释放资源 + HANDLE hDevice); // 设备句柄,它由CreateDevice函数创建 + + //##################### AD数据读取函数(DMA方式)(上层用户函数) ########################### + // AD直接内存(DMA)方式函数 + BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceDmaAD( // 初始化设备,当返回TRUE后,设备即准备就绪. + HANDLE hDevice, // 设备对象,它由CreateDevice函数创建 + HANDLE hDmaEvent, // DMA事件句柄,它由CreateSystemEvent创建 + WORD ADBuffer[], // 用户缓冲区,最好为两维数组 + LONG nReadSizeWords, // 每次DMA时,用户从指定缓冲应读取的实际长度(要小于或等于nSegmentSizeWords) + LONG nSegmentCount, // 缓冲分段的数量,取值范围为2-64 + LONG nSegmentSizeWords, // 缓冲区分段的段长(必须等于FIFO半满长度) + PPCI8622_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 + + BOOL DEVAPI FAR PASCAL PCI8622_StartDeviceDmaAD( // 在初始化之后,启动设备 + HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 + + BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusDmaAD( // 在AD采样过程中取得DMA的有关状态,返回值表示函数是否成功 + HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 + PPCI8622_STATUS_DMA pDMAStatus); // 获得的DMA工作状态 + + BOOL DEVAPI FAR PASCAL PCI8622_SetDevStatusDmaAD( // 在AD采样过程中设置DMA的有关状态,返回值表示函数是否成功 + HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 + LONG iClrBufferID); // 要清除的缓冲区ID,将其置为0 + + BOOL DEVAPI FAR PASCAL PCI8622_StopDeviceDmaAD( // 在启动设备之后,暂停设备 + HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 + + BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceDmaAD( // 关闭AD设备,禁止传输,且释放资源 + HANDLE hDevice); // 设备句柄,它由CreateDevice函数创建 + + //##################### AD的硬件参数操作函数 ########################### + BOOL DEVAPI FAR PASCAL PCI8622_SaveParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将当前的AD采样参数保存至系统中 + BOOL DEVAPI FAR PASCAL PCI8622_LoadParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将AD采样参数从系统中读出 + BOOL DEVAPI FAR PASCAL PCI8622_ResetParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将AD采样参数恢复至出厂默认值 + + //####################### 计数器与定时器操作函数 ######################### + BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceCNT( // 初始化各路计数/定时器 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + PPCI8622_PARA_CNT pCNTPara); + + ULONG DEVAPI FAR PASCAL PCI8622_SetLCLKFreqCNT( // 设置本地时钟频率(LCLK=Local Clock),返回实际的分频数 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + double Frequency); // 时钟频率值 + + BOOL DEVAPI FAR PASCAL PCI8622_SetDeviceCNT( // 设置计数器的初值 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + ULONG CNTVal, // 计数初值, COUNTER: 计数初值,TIMER:延时初始脉冲宽度(16位) + ULONG WidthVal); // 宽度初值, COUNTER: 无效, TIMER:输出脉冲宽度(16位) + + BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceCNT( // 取得各路计数器的当前计数值 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + PULONG pCNTVal, // 返回计数值 + PULONG pWidthVal); // 返回宽度值 + + BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusCNT( // 获得计数器状态 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + PBOOL bOverflow, // 获得的计数器溢出标志, =TRUE:表示计数器已溢出, =FALSE:表示未溢出 + PBOOL bBufferRefresh, // 获得的计数器缓冲更新标志, =TRUE:表示缓冲已被更新, =FALSE:表示未更新 + PBOOL bBufferLost); // 获得的计数器缓冲丢失标志, =TRUE:表示缓冲已被丢失, =FALSE:表示未丢失 + + BOOL DEVAPI FAR PASCAL PCI8622_ClrDevStatusCNT( // 清除计数器状态 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + BOOL bOverflow, // 是否清除计数器溢出标志, =TRUE:表示清除, =FALSE:表示不清除 + BOOL bBufferRefresh, // 是否清除计数器缓冲更新标志, =TRUE:表示清除, =FALSE:表示不清除 + BOOL bBufferLost); // 是否清除计数器缓冲丢失标志, =TRUE:表示清除, =FALSE:表示不清除 + + BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceCNT( // 释放和停止计数/定时器 + HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 + + //####################### 数字I/O输入输出函数 ################################# + // 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O + // 输入输出,但使用下面两个函数更省事,它不需要您关心寄存器分配和位操作等,而只 + // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。 + BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceDI( // 取得数字量状态 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + BYTE bDISts[16]); // 开关输入状态(注意: 必须定义为16个字节元素的数组) + + BOOL DEVAPI FAR PASCAL PCI8622_SetDeviceDO( // 输出数字量状态 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + BYTE bDOSts[16]); // 开关输出状态(注意: 必须定义为16个字节元素的数组) + + BOOL DEVAPI FAR PASCAL PCI8622_RetDeviceDO( // 回读数字量输出状态 + HANDLE hDevice, // 设备句柄 + BYTE DISts[16]); // 获得开关输出状态(注意: 必须定义为16个字节元素的数组) + + //################# 内存映射寄存器直接操作及读写函数 ######################## + // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 + // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 + BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceBar( // 取得指定的指定设备寄存器组BAR地址 + HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 + PUCHAR pbPCIBar[6]); // 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书 + BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterByte( // 往设备的映射寄存器空间指定端口写入单节字数据 + HANDLE hDevice, // 设备对象 + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes, // 相对于基地址的偏移位置 + BYTE Value); // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定) + BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterWord( // 写双字节数据(其余同上) + HANDLE hDevice, + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes, + WORD Value); + BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterULong( // 写四节字数据(其余同上) + HANDLE hDevice, + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes, + ULONG Value); + BYTE DEVAPI FAR PASCAL PCI8622_ReadRegisterByte( // 读入单字节数据(其余同上) + HANDLE hDevice, + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes); + WORD DEVAPI FAR PASCAL PCI8622_ReadRegisterWord( // 读入双字节数据(其余同上) + HANDLE hDevice, + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes); + ULONG DEVAPI FAR PASCAL PCI8622_ReadRegisterULong( // 读入四字节数据(其余同上) + HANDLE hDevice, + PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 + ULONG OffsetBytes); + + //################# I/O端口直接操作及读写函数 ######################## + // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 + // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 + // 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备 + BOOL DEVAPI FAR PASCAL PCI8622_WritePortByte(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, BYTE Value); + BOOL DEVAPI FAR PASCAL PCI8622_WritePortWord(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, WORD Value); + BOOL DEVAPI FAR PASCAL PCI8622_WritePortULong(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, ULONG Value); + + BYTE DEVAPI FAR PASCAL PCI8622_ReadPortByte(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); + WORD DEVAPI FAR PASCAL PCI8622_ReadPortWord(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); + ULONG DEVAPI FAR PASCAL PCI8622_ReadPortULong(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); + + //########################### 附加操作函数 ###################################### + HANDLE DEVAPI FAR PASCAL PCI8622_CreateSystemEvent(void); // 创建内核事件对象,供InitDeviceInt和VB子线程等函数使用 + BOOL DEVAPI FAR PASCAL PCI8622_ReleaseSystemEvent(HANDLE hEvent); // 释放内核事件对象 + +#ifdef __cplusplus +} +#endif +#endif // _PCI8622_DEVICE_ diff --git a/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622_32.lib b/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622_32.lib new file mode 100644 index 0000000000000000000000000000000000000000..2c5ca8efb3e1e443d3ce589978336597e293bbe7 GIT binary patch literal 14186 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 +} + + +void CSo7_Art_PCI8622::OnBnClickedButtonArtPci8622ClearLog() +{ + // TODO: Add your control notification handler code here +} + + +void CSo7_Art_PCI8622::OnBnClickedCancel() +{ + CDialog::OnCancel(); +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Art_PCI8622.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Art_PCI8622.h new file mode 100644 index 0000000..e85506d --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Art_PCI8622.h @@ -0,0 +1,25 @@ +#pragma once + + +// CSo7_Art_PCI8622 dialog + +class CSo7_Art_PCI8622 : public CDialog +{ + DECLARE_DYNAMIC(CSo7_Art_PCI8622) + +public: + CSo7_Art_PCI8622(CWnd* pParent = NULL); // standard constructor + virtual ~CSo7_Art_PCI8622(); + +// Dialog Data + enum { IDD = IDD_SO7_ART_PCI8622 }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedButtonArtPci8622ReadData(); + afx_msg void OnBnClickedButtonArtPci8622ClearLog(); + afx_msg void OnBnClickedCancel(); +}; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index 6f2d5e1..668105b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -34,6 +34,10 @@ #include "KeyenceLKH_Dlg.h" #include "Keyence_LKG5000_Ethernet.h" +#include "..\..\..\ART\ART_PCI8622.h" +#include "So7_Art_PCI8622.h" + + #include "..\..\..\SevenOcean\dll.h" #include "..\..\..\SevenOcean\So7_Interface.h" #include "So7_Util_ImageDll.h" @@ -61,6 +65,7 @@ CSo7_Interface* m_pSo7_Interface=NULL; CEF8000_Interface* m_pEF8000_Interface=NULL; CXBOXController* XBoxPlayer =NULL; +CART_PCI8622* m_pART_PCI8622=NULL; // CSo7_Option dialog IMPLEMENT_DYNAMIC(CSo7_Option, CDialog) @@ -86,6 +91,7 @@ BEGIN_MESSAGE_MAP(CSo7_Option, CDialog) ON_WM_TIMER() ON_BN_CLICKED(IDOK, &CSo7_Option::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CSo7_Option::OnBnClickedCancel) + ON_BN_CLICKED(IDC_RADIO_ART_PCI8622, &CSo7_Option::OnBnClickedRadioArtPci8622) END_MESSAGE_MAP() @@ -125,7 +131,8 @@ BOOL CSo7_Option::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_KEYENCE_LASER))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_SO7_VERIFICATION_ALGORITHM))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_TEST_IMAGE_DLL))->SetCheck(FALSE); - + ((CButton *)GetDlgItem(IDC_RADIO_ART_PCI8622))->SetCheck(FALSE); + #ifdef _RELEASE_SO7_CONTROLER_ONLY ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SDK3000))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV2000E))->EnableWindow(FALSE); @@ -139,6 +146,7 @@ BOOL CSo7_Option::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_KEYENCE_LASER3))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_SO7_VERIFICATION_ALGORITHM))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_TEST_IMAGE_DLL))->EnableWindow(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO_ART_PCI8622))->EnableWindow(FALSE); #endif #ifdef _RELEASE_ONLY_ONE_FUNCTION @@ -323,6 +331,21 @@ void CSo7_Option::OnBnClickedOk() delete m_pKeyence_Laser_LK_H; m_pKeyence_Laser_LK_H=NULL; } + else if(((CButton *)GetDlgItem(IDC_RADIO_ART_PCI8622))->GetCheck()) + { + if (!m_pART_PCI8622) + { + m_pART_PCI8622=new CART_PCI8622(); + } + + CSo7_Art_PCI8622* pSo7_Art_PCI8622=new CSo7_Art_PCI8622(); + pSo7_Art_PCI8622->DoModal(); + delete pSo7_Art_PCI8622; + pSo7_Art_PCI8622=nullptr; + + delete m_pART_PCI8622; + m_pART_PCI8622=NULL; + } else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SDK3000))->GetCheck()) { #ifdef _RELEASE_FULL_VERSION @@ -402,3 +425,9 @@ void CSo7_Option::OnTimer(UINT_PTR nIDEvent) } CDialog::OnTimer(nIDEvent); } + + +void CSo7_Option::OnBnClickedRadioArtPci8622() +{ + // TODO: Add your control notification handler code here +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.h index 7db5a5d..b40304f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.h @@ -23,4 +23,5 @@ public: afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedCancel(); afx_msg void OnTimer(UINT_PTR nIDEvent); + afx_msg void OnBnClickedRadioArtPci8622(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index c569da6..8dfb21a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -145,7 +145,7 @@ $(IntDir);%(AdditionalIncludeDirectories) - ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;%(AdditionalDependencies) + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;..\..\..\ART\PCI8622_32.lib;%(AdditionalDependencies) true Windows MachineX86 @@ -206,7 +206,7 @@ true true MachineX86 - ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\SV2000E\dataAcq.lib;..\..\..\Videocard\SV2000E\DXMediaCap.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;%(AdditionalDependencies) + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\SV2000E\dataAcq.lib;..\..\..\Videocard\SV2000E\DXMediaCap.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\ART\PCI8622_32.lib;%(AdditionalDependencies) @@ -303,6 +303,7 @@ + @@ -351,6 +352,7 @@ + @@ -383,6 +385,8 @@ + + @@ -435,6 +439,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 6d0cad1..44414b2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -202,6 +202,12 @@ Sources Files + + Sources Files + + + Sources Files + @@ -438,6 +444,15 @@ Header Files + + Header Files + + + Header Files + + + Header Files + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 26f423e..675709d 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -718,6 +718,7 @@ #define IDC_EDIT_TEST_KEYENCE_MESSAGE 1591 #define IDC_RADIO_KEYENCE_LASER3 1591 #define IDC_RADIO_MACHINE_KEYENCE_TM3000 1592 +#define IDC_RADIO_ART_PCI8622 1592 #define IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER 1593 #define IDC_RADIO_KEYENCE_LASER_LK_H 1594 #define IDC_RADIO_TEST_IMAGE_DLL 1595 @@ -850,6 +851,7 @@ #define IDD_SO7_VIDEOCARD_TC4000 1718 #define IDD_DIALOG_KEYENCE_LKG5000 1719 #define IDD_SO7_UTIL_SETUP_SO7_CONFIG_MOTION 1720 +#define IDD_SO7_ART_PCI8622 1721 #define IDC_RADIO_SPEED_SLOW 1770 #define IDC_RADIO_SCALE 1772 #define IDC_EDIT_SPEED_X 1773 @@ -962,11 +964,15 @@ #define IDC_STATIC_IO_ADDR5 1841 #define IDC_STATIC_IO_ADDR6 1842 #define IDC_BUTTON_START_SO7_R_MACHINE 1843 +#define IDC_BUTTON_ART_PCI8622_START 1843 #define IDC_BUTTON_STOP_SO7_R_MACHINE 1844 +#define IDC_BUTTON_ART_PCI8622_STOP 1844 #define IDC_BUTTON_R1_HOME 1845 +#define IDC_BUTTON_ART_PCI8622_READ_DATA 1845 #define IDC_CHECK_SO7_R1_ENABLE 1846 +#define IDC_EDIT_ART_PCI8622_LOG 1846 #define IDC_EDIT_R1_CURRENT_POSITION 1847 - +#define IDC_BUTTON_ART_PCI8622_CLEAR_LOG 1847 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -976,7 +982,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 191 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1843 +#define _APS_NEXT_CONTROL_VALUE 1848 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 5cbc5f8c94b3bc654ee4c05db1e4e6eec7dff03e..a42d939c207a68c19c38d030a9ede3b7ea25ddac 100644 GIT binary patch delta 4359 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 delta 3513 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