public DWORD InitLoad() { var pciDevList = PCIE_DeviceList.TheDeviceList(); //GlobalHost.DependencyResolver.Register(typeof(PCIE_DeviceList), () => pciDevList); try { if (DeviceStatus) { return(0); } DWORD dwStatus = pciDevList.Init(Settings.Default.License); if (dwStatus != (DWORD)wdc_err.WD_STATUS_SUCCESS) { LogHelper.WriteLog(string.Format("设备初始化异常,错误码:{0}", dwStatus)); return(dwStatus); } LogHelper.WriteLog(string.Format("总发现{0}张设备卡", pciDevList.Count)); DeviceStatus = true; return(dwStatus); } catch (Exception ex) { LogHelper.ErrorLog(ex); return(1000); } }
public PCIE_diag() //默认构造方法 { InitializeComponent(); //pcie_diag 窗口初始化方法 //实例化委托 delegate ac = new delegate(TraceLog) 那么 ac就代表TraceLog函数 log = new Log(new Log.TRACE_LOG(TraceLog), new Log.ERR_LOG(ErrLog)); //将log的实现方法传入Log类中 pciDevList = PCIE_DeviceList.TheDeviceList(); //获取设备列表对象 }
public void CloseScanDevice() { var devices = PCIE_DeviceList.TheDeviceList(); for (int i = 0; i < devices.Count; i++) { var dev = (PCIE_Device)devices[i]; dev.WriteBAR0(0, 0x28, 0); dev.WriteBAR0(0, 0x10, 0); } }
public string InitDeviceInfo(int index) { DeviceChannelList.Clear(); string desc = string.Empty; var device = PCIE_DeviceList.TheDeviceList().Get(index); for (int i = 0; i < PCIE_DeviceList.TheDeviceList().Count; i++) { var item = PCIE_DeviceList.TheDeviceList().Get(i); DeviceChannelList.Add(item, AddChannel(i)); } DWORD outData = 0; device.ReadBAR0(0, 0x00, ref outData); if ((outData & 0x10) == 0x10) { desc += "链路速率:2.5Gb/s\r\n"; } else if ((outData & 0x20) == 0x20) { desc += "链路速率:5.0Gb/s\r\n"; } else { desc += "speed judge error/s\r\n"; } outData = (outData & 0xF); if (outData == 1) { desc += "链路宽度:x1"; } else if (outData == 2) { desc += "链路宽度:x2"; } else if (outData == 4) { desc += "链路宽度:x4"; } else if (outData == 8) { desc += "链路宽度:x8"; } else { desc += "width judge error/s\r\n"; } Clients.Client(Context.ConnectionId).NoticeMessage("已成功获取链路信息!" + "\n"); return(desc); }
public void CloseDma() { IsStop = true; var devices = PCIE_DeviceList.TheDeviceList(); for (int i = 0; i < devices.Count; i++) { var dev = (PCIE_Device)devices[i]; dev.WriteBAR0(0, 0x28, 0); dev.WriteBAR0(0, 0x10, 0); dev.Status = 0; } readSize = 0; }
/* Close handle to a NEWAMD86 device */ public bool DeviceClose(int iSelectedIndex) { readSize = 0; //pBoard->pci_e.WriteBAR0(0, 0x10, regval); LogHelper.WriteLog(string.Format("断开第{0}张板卡", iSelectedIndex + 1)); var devices = PCIE_DeviceList.TheDeviceList(); PCIE_Device device = PCIE_DeviceList.TheDeviceList().Get(iSelectedIndex); bool bStatus = false; try { Clients.Client(Context.ConnectionId).NoticeMessage("正在停止数据读取...\n"); CloseDma(); Clients.Client(Context.ConnectionId).NoticeMessage("已停止数据读取!\n"); for (int i = 0; i < devices.Count; i++) { var dev = devices.Get(i); if (dev != null) { if (dev.Handle != IntPtr.Zero && !(bStatus = dev.Close())) { string str = "断开设备: 关闭设备失败 (" + dev.ToString(false) + ")"; Clients.Client(Context.ConnectionId).NoticeMessage(str); LogHelper.WriteLog(str); } else { dev.Handle = IntPtr.Zero; dev.ppwDma = IntPtr.Zero; dev.pReportWrBuffer = IntPtr.Zero; dev.pReportWrDMA = IntPtr.Zero; dev.pWbuffer = IntPtr.Zero; bStatus = true; } } } if (bStatus) { Clients.Client(Context.ConnectionId).NoticeMessage("已成功断开设备!\n"); } return(bStatus); } catch (Exception ex) { LogHelper.ErrorLog(ex, "DeviceClose"); Clients.Client(Context.ConnectionId).NoticeMessage(ex.Message + "close \n"); } return(false); }
/* Open a handle to a device */ public bool DeviceOpen(int iSelectedIndex) { LogHelper.WriteLog(string.Format("连接第{0}张板卡", iSelectedIndex + 1)); DWORD dwStatus = 0; var devices = PCIE_DeviceList.TheDeviceList(); PCIE_Device device = PCIE_DeviceList.TheDeviceList().Get(iSelectedIndex); if (device == null) { return(false); } /* Open a handle to the device */ try { for (int i = 0; i < devices.Count; i++) { var dev = devices.Get(i); if (dev != null) { dwStatus = dev.Open(); if (dwStatus != (DWORD)wdc_err.WD_STATUS_SUCCESS) { string str = "打开设备: 连接设备失败 (" + dev.ToString(false) + ")\n"; Clients.Client(Context.ConnectionId).NoticeMessage(str); LogHelper.WriteLog(str); } } } Clients.Client(Context.ConnectionId).NoticeMessage("已成功连接设备!\n"); if (dwStatus > 0) { return(false); } return(true); } catch (Exception ex) { LogHelper.ErrorLog(ex, "DeviceOpen"); Clients.Client(Context.ConnectionId).NoticeMessage(ex.Message + " open\n"); return(false); } }
public string OnReadDma(string dvireName, int dataSize, int deviceIndex) { //var findDrive = DriveInfo.GetDrives().FirstOrDefault(o => o.Name == dvireName); //if (findDrive != null) //{ // if (findDrive.AvailableFreeSpace < 1024 * 1024 * 1024.0) // { // } //} int cout = PCIE_DeviceList.TheDeviceList().Count; if (cout == 1 && deviceIndex == 1) { return(""); } PCIE_Device dev = PCIE_DeviceList.TheDeviceList().Get(deviceIndex); if (dev == null) { Clients.Client(Context.ConnectionId).NoticeMessage("设备DMA读取发生异常" + "\n"); return("设备读取异常,请重试"); } if (dev.Status == 1) { return("正在读取数据..."); } Clients.Client(Context.ConnectionId).NoticeMessage("正在读取设备数据...\n"); dev.FPGAReset(0); if (dev.WDC_DMAContigBufLock() != 0) { Clients.Client(Context.ConnectionId).NoticeMessage("锁定内存空间失败..." + "\n"); //MessageBox.Show(("分配报告内存失败")); DeviceClose(0); return("锁定内存空间失败"); } //DWORD wrDMASize = dataSize; //16kb if (!dev.DMAWriteMenAlloc((uint)0, (uint)1, (UInt32)dataSize * 1024)) { //MessageBox.Show("内存分配失败!"); Clients.Client(Context.ConnectionId).NoticeMessage("内存分配失败..." + "\n"); DeviceClose(0); return("内存分配失败"); } string dt = DateTime.Now.ToString("yyyyMMddHHmmss"); // var list = DeviceChannelList[dev]; //foreach (var item in list) //{ // var dir = Path.Combine(dvireName, item.DiskPath); // if (!Directory.Exists(dir)) // { // Directory.CreateDirectory(dir); // } // var filePath = Path.Combine(dir, dt); // //File.Create(filePath); // item.FilePath = filePath; // if (item.IsOpen) // { // item.Stream = new FileStream(filePath, FileMode.Append, FileAccess.Write); // } //} var dir = Path.Combine(dvireName, "device" + deviceIndex.ToString()); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var filePath = Path.Combine(dir, dt); dev.DeviceFile = new FileStream(filePath, FileMode.Append, FileAccess.Write); dev.StartWrDMA(0); //Thread readThread = new Thread(new ParameterizedThreadStart(p =>); //readThread.IsBackground = true; //readThread.Start(); Task.Factory.StartNew(new Action(() => OnScanDrive(dev, dvireName, deviceIndex))); //Thread nonParameterThread = new Thread(new ParameterizedThreadStart(p => NonParameterRun(dev, dvireName, dataSize, deviceIndex))); //nonParameterThread.Start(); Task.Factory.StartNew(new Action(() => NonParameterRun(dev, dvireName, dataSize, deviceIndex))).ContinueWith(t => { dev.DeviceFile.Flush(); dev.DeviceFile.Close(); dev.DeviceFile.Dispose(); }); return(string.Empty); }
public string ScanDevice(int deviceIndex) { int count = PCIE_DeviceList.TheDeviceList().Count; PCIE_Device dev = PCIE_DeviceList.TheDeviceList().Get(deviceIndex); if (dev == null) { return("device"); } if (dev.WDCScan_DMAContigBufLock() != 0) { //MessageBox.Show(("分配报告内存失败")); return("device"); } ////DWORD wrDMASize = dataSize; //16kb if (!dev.ScanDMAWriteMenAlloc(16 * 1024)) { //MessageBox.Show("内存分配失败!"); return("device"); } dev.StartWrDMA(0); dev.WriteBAR0(0, 0x60, 1); //中断屏蔽 dev.WriteBAR0(0, 0x50, 1); //dma 写报告使能 var dma = (WD_DMA)dev.m_dmaMarshaler.MarshalNativeToManaged(dev.pScanReportWrDMA); var ppwDma = (WD_DMA)dev.m_dmaMarshaler.MarshalNativeToManaged(dev.pScanpwDma); dev.WriteBAR0(0, 0x58, (uint)dma.Page[0].pPhysicalAddr); //dma 写报告地址 //设置初始DMA写地址,长度等 dev.WriteBAR0(0, 0x4, (uint)ppwDma.Page[0].pPhysicalAddr); //wr_addr low dev.WriteBAR0(0, 0x8, (uint)(ppwDma.Page[0].pPhysicalAddr >> 32)); //wr_addr high dev.WriteBAR0(0, 0xC, (UInt32)16 * 1024); //dma wr size dev.WriteBAR0(0, 0x28, 1); //int readIndex = 0; var dt = DateTime.Now; while (true) { var current = (DateTime.Now - dt).Seconds; if (current > 1) { break; } dev.WriteBAR0(0, 0x10, 1); } dev.WriteBAR0(0, 0x10, 1); dev.WriteBAR0(0, 0x28, 0); dev.WriteBAR0(0, 0x10, 0); //启动DMA // //dma wr 使能 byte[] tmpResult = new Byte[16 * 1024]; Marshal.Copy(dev.pScanWbuffer, tmpResult, 0, 16 * 1024); LogHelper.WriteLog(string.Format("设备{0}自检返回数据: ", deviceIndex + 1) + CommonHelper.ByteToString(tmpResult)); var findItem = tmpResult.Where(o => o == 63).Count(); LogHelper.WriteLog(findItem.ToString()); //var findItem = barList.FirstOrDefault(o => o != 63); if (findItem > 50) { // scanStr = "设备所有通道自检正常!"; return(string.Empty); } else { string errorStr = deviceIndex == 0 ? "1,2,3" : " 4,5,6"; var query = tmpResult.Where(o => o == 3).Count(); if (query > 50) { errorStr = deviceIndex == 0 ? "2,3" : " 5,6"; } var query1 = tmpResult.Where(o => o == 12).Count(); if (query1 > 50) { errorStr = deviceIndex == 0 ? "1,3" : " 4,6"; } var query2 = tmpResult.Where(o => o == 15).Count(); if (query2 > 50) { errorStr = deviceIndex == 0 ? "3" : " 6"; LogHelper.WriteLog(query2.ToString()); } var query3 = tmpResult.Where(o => o == 48).Count(); if (query3 > 50) { errorStr = deviceIndex == 0 ? "1,2" : " 4,5"; } var query4 = tmpResult.Where(o => o == 51).Count(); if (query4 > 50) { errorStr = deviceIndex == 0 ? "2" : " 5"; } var query5 = tmpResult.Where(o => o == 60); if (query5.Count() > 50) { errorStr = deviceIndex == 0 ? "1" : " 4"; LogHelper.WriteLog(query5.ToString()); } //var query6 = tmpResult.Where(o => o == 0); //if (query6.Count()==tmpResult.Count()) //{ // errorStr = deviceIndex == 0 ? "1,2,3" : " 4,5,6"; //} //switch (findItem) //{ // case 3: // errorStr = deviceIndex == 0 ? "1,2" : " 4,5"; // break; // case 12: // errorStr = deviceIndex == 0 ? "1,3" : " 4,6"; // break; // case 15: // errorStr = deviceIndex == 0 ? "1" : " 4"; // break; // case 48: // errorStr = deviceIndex == 0 ? "2,3" : " 5,6"; // break; // case 51: // errorStr = deviceIndex == 0 ? "2" : " 5"; // break; // case 60: // errorStr = deviceIndex == 0 ? "3" : " 6"; // break; // default: // errorStr ="Error"; // break; //} // scanStr += errorStr; // tmpInfo +=errorStr+""; return(errorStr); } }