public static FT232HDetectorInformation Detect(string serialNumber = null) { var r = new FT232HDetectorInformation(); var ft232h = new FTD2XX_NET.FTDI(); UInt32 count = 0; Ok(ft232h.GetNumberOfDevices(ref count)); if (count == 0) { Console.WriteLine("No FT232H device detected"); return(r); } FT_DEVICE_INFO_NODE ft232hDevice = null; var devices = new FT_DEVICE_INFO_NODE[count]; ft232h.GetDeviceList(devices); if (serialNumber == null) { ft232hDevice = devices[0]; } else { ft232hDevice = devices.ToList().FirstOrDefault(d => d.SerialNumber == serialNumber); } r.SerialNumber = ft232hDevice.SerialNumber; r.DeviceType = ft232hDevice.Type; r.Description = ft232hDevice.Description; if (ft232hDevice == null) { return(FT232HDetectorInformation.Failed); } Ok(ft232h.OpenBySerialNumber(ft232hDevice.SerialNumber)); var ee232h = new FT232H_EEPROM_STRUCTURE(); var rr = ft232h.ReadFT232HEEPROM(ee232h); if (rr == FT_STATUS.FT_OK) { r.Description = ee232h.Description; r.Properties = GetDictionary(ee232h); } ft232h.Close(); r.Ok = true; return(r); }
private static Dictionary <string, object> GetDictionary(FT232H_EEPROM_STRUCTURE ee232h) { var result = new Dictionary <string, object>(); Type t = typeof(FT232H_EEPROM_STRUCTURE); foreach (var field in t.GetFields()) { string name = field.Name; var value = field.GetValue(ee232h); result.Add(name, value); } return(result); }
//************************************************************************** // WriteFT232HEEPROM //************************************************************************** // Intellisense comments /// <summary> /// Writes the specified values to the EEPROM of an FT232H device. /// Calls FT_EE_Program in FTD2XX DLL /// </summary> /// <returns>FT_STATUS value from FT_EE_Program in FTD2XX DLL</returns> /// <param name="ee232h">The EEPROM settings to be written to the device</param> /// <remarks>If the strings are too long, they will be truncated to their maximum permitted lengths</remarks> /// <exception cref="FT_EXCEPTION">Thrown when the current device does not match the type required by this method.</exception> public FT_STATUS WriteFT232HEEPROM(FT232H_EEPROM_STRUCTURE ee232h) { // Initialise ftStatus to something other than FT_OK FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR; FT_ERROR ftErrorCondition = FT_ERROR.FT_NO_ERROR; // If the DLL hasn't been loaded, just return here if (hFTD2XXDLL == IntPtr.Zero) return ftStatus; // Check for our required function pointers being set up if (pFT_EE_Program != IntPtr.Zero) { tFT_EE_Program FT_EE_Program = (tFT_EE_Program)Marshal.GetDelegateForFunctionPointer(pFT_EE_Program, typeof(tFT_EE_Program)); if (ftHandle != IntPtr.Zero) { FT_DEVICE DeviceType = FT_DEVICE.FT_DEVICE_UNKNOWN; // Check that it is an FT232H that we are trying to write GetDeviceType(ref DeviceType); if (DeviceType != FT_DEVICE.FT_DEVICE_232H) { // If it is not, throw an exception ftErrorCondition = FT_ERROR.FT_INCORRECT_DEVICE; ErrorHandler(ftStatus, ftErrorCondition); } // Check for VID and PID of 0x0000 if ((ee232h.VendorID == 0x0000) | (ee232h.ProductID == 0x0000)) { // Do not allow users to program the device with VID or PID of 0x0000 return FT_STATUS.FT_INVALID_PARAMETER; } FT_PROGRAM_DATA eedata = new FT_PROGRAM_DATA(); // Set up structure headers eedata.Signature1 = 0x00000000; eedata.Signature2 = 0xFFFFFFFF; eedata.Version = 5; // Allocate space from unmanaged heap eedata.Manufacturer = Marshal.AllocHGlobal(32); eedata.ManufacturerID = Marshal.AllocHGlobal(16); eedata.Description = Marshal.AllocHGlobal(64); eedata.SerialNumber = Marshal.AllocHGlobal(16); // Check lengths of strings to make sure that they are within our limits // If not, trim them to make them our maximum length if (ee232h.Manufacturer.Length > 32) ee232h.Manufacturer = ee232h.Manufacturer.Substring(0, 32); if (ee232h.ManufacturerID.Length > 16) ee232h.ManufacturerID = ee232h.ManufacturerID.Substring(0, 16); if (ee232h.Description.Length > 64) ee232h.Description = ee232h.Description.Substring(0, 64); if (ee232h.SerialNumber.Length > 16) ee232h.SerialNumber = ee232h.SerialNumber.Substring(0, 16); // Set string values eedata.Manufacturer = Marshal.StringToHGlobalAnsi(ee232h.Manufacturer); eedata.ManufacturerID = Marshal.StringToHGlobalAnsi(ee232h.ManufacturerID); eedata.Description = Marshal.StringToHGlobalAnsi(ee232h.Description); eedata.SerialNumber = Marshal.StringToHGlobalAnsi(ee232h.SerialNumber); // Map non-string elements to structure // Standard elements eedata.VendorID = ee232h.VendorID; eedata.ProductID = ee232h.ProductID; eedata.MaxPower = ee232h.MaxPower; eedata.SelfPowered = Convert.ToUInt16(ee232h.SelfPowered); eedata.RemoteWakeup = Convert.ToUInt16(ee232h.RemoteWakeup); // 232H specific fields eedata.PullDownEnableH = Convert.ToByte(ee232h.PullDownEnable); eedata.SerNumEnableH = Convert.ToByte(ee232h.SerNumEnable); eedata.ACSlowSlewH = Convert.ToByte(ee232h.ACSlowSlew); eedata.ACSchmittInputH = Convert.ToByte(ee232h.ACSchmittInput); eedata.ACDriveCurrentH = Convert.ToByte(ee232h.ACDriveCurrent); eedata.ADSlowSlewH = Convert.ToByte(ee232h.ADSlowSlew); eedata.ADSchmittInputH = Convert.ToByte(ee232h.ADSchmittInput); eedata.ADDriveCurrentH = Convert.ToByte(ee232h.ADDriveCurrent); eedata.Cbus0H = Convert.ToByte(ee232h.Cbus0); eedata.Cbus1H = Convert.ToByte(ee232h.Cbus1); eedata.Cbus2H = Convert.ToByte(ee232h.Cbus2); eedata.Cbus3H = Convert.ToByte(ee232h.Cbus3); eedata.Cbus4H = Convert.ToByte(ee232h.Cbus4); eedata.Cbus5H = Convert.ToByte(ee232h.Cbus5); eedata.Cbus6H = Convert.ToByte(ee232h.Cbus6); eedata.Cbus7H = Convert.ToByte(ee232h.Cbus7); eedata.Cbus8H = Convert.ToByte(ee232h.Cbus8); eedata.Cbus9H = Convert.ToByte(ee232h.Cbus9); eedata.IsFifoH = Convert.ToByte(ee232h.IsFifo); eedata.IsFifoTarH = Convert.ToByte(ee232h.IsFifoTar); eedata.IsFastSerH = Convert.ToByte(ee232h.IsFastSer); eedata.IsFT1248H = Convert.ToByte(ee232h.IsFT1248); eedata.FT1248CpolH = Convert.ToByte(ee232h.FT1248Cpol); eedata.FT1248LsbH = Convert.ToByte(ee232h.FT1248Lsb); eedata.FT1248FlowControlH = Convert.ToByte(ee232h.FT1248FlowControl); eedata.IsVCPH = Convert.ToByte(ee232h.IsVCP); eedata.PowerSaveEnableH = Convert.ToByte(ee232h.PowerSaveEnable); // Call FT_EE_Program ftStatus = FT_EE_Program(ftHandle, eedata); // Free unmanaged buffers Marshal.FreeHGlobal(eedata.Manufacturer); Marshal.FreeHGlobal(eedata.ManufacturerID); Marshal.FreeHGlobal(eedata.Description); Marshal.FreeHGlobal(eedata.SerialNumber); } } else { if (pFT_EE_Program == IntPtr.Zero) { MessageBox.Show("Failed to load function FT_EE_Program."); } } return ftStatus; }
//************************************************************************** // ReadFT232HEEPROM //************************************************************************** // Intellisense comments /// <summary> /// Reads the EEPROM contents of an FT232H device. /// </summary> /// <returns>FT_STATUS value from FT_EE_Read in FTD2XX DLL</returns> /// <param name="ee232h">An FT232H_EEPROM_STRUCTURE which contains only the relevant information for an FT232H device.</param> /// <exception cref="FT_EXCEPTION">Thrown when the current device does not match the type required by this method.</exception> public FT_STATUS ReadFT232HEEPROM(FT232H_EEPROM_STRUCTURE ee232h) { // Initialise ftStatus to something other than FT_OK FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR; FT_ERROR ftErrorCondition = FT_ERROR.FT_NO_ERROR; // If the DLL hasn't been loaded, just return here if (hFTD2XXDLL == IntPtr.Zero) return ftStatus; // Check for our required function pointers being set up if (pFT_EE_Read != IntPtr.Zero) { tFT_EE_Read FT_EE_Read = (tFT_EE_Read)Marshal.GetDelegateForFunctionPointer(pFT_EE_Read, typeof(tFT_EE_Read)); if (ftHandle != IntPtr.Zero) { FT_DEVICE DeviceType = FT_DEVICE.FT_DEVICE_UNKNOWN; // Check that it is an FT232H that we are trying to read GetDeviceType(ref DeviceType); if (DeviceType != FT_DEVICE.FT_DEVICE_232H) { // If it is not, throw an exception ftErrorCondition = FT_ERROR.FT_INCORRECT_DEVICE; ErrorHandler(ftStatus, ftErrorCondition); } FT_PROGRAM_DATA eedata = new FT_PROGRAM_DATA(); // Set up structure headers eedata.Signature1 = 0x00000000; eedata.Signature2 = 0xFFFFFFFF; eedata.Version = 5; // Allocate space from unmanaged heap eedata.Manufacturer = Marshal.AllocHGlobal(32); eedata.ManufacturerID = Marshal.AllocHGlobal(16); eedata.Description = Marshal.AllocHGlobal(64); eedata.SerialNumber = Marshal.AllocHGlobal(16); // Call FT_EE_Read ftStatus = FT_EE_Read(ftHandle, eedata); // Retrieve string values ee232h.Manufacturer = Marshal.PtrToStringAnsi(eedata.Manufacturer); ee232h.ManufacturerID = Marshal.PtrToStringAnsi(eedata.ManufacturerID); ee232h.Description = Marshal.PtrToStringAnsi(eedata.Description); ee232h.SerialNumber = Marshal.PtrToStringAnsi(eedata.SerialNumber); // Free unmanaged buffers Marshal.FreeHGlobal(eedata.Manufacturer); Marshal.FreeHGlobal(eedata.ManufacturerID); Marshal.FreeHGlobal(eedata.Description); Marshal.FreeHGlobal(eedata.SerialNumber); // Map non-string elements to structure to be returned // Standard elements ee232h.VendorID = eedata.VendorID; ee232h.ProductID = eedata.ProductID; ee232h.MaxPower = eedata.MaxPower; ee232h.SelfPowered = Convert.ToBoolean(eedata.SelfPowered); ee232h.RemoteWakeup = Convert.ToBoolean(eedata.RemoteWakeup); // 232H specific fields ee232h.PullDownEnable = Convert.ToBoolean(eedata.PullDownEnableH); ee232h.SerNumEnable = Convert.ToBoolean(eedata.SerNumEnableH); ee232h.ACSlowSlew = Convert.ToBoolean(eedata.ACSlowSlewH); ee232h.ACSchmittInput = Convert.ToBoolean(eedata.ACSchmittInputH); ee232h.ACDriveCurrent = eedata.ACDriveCurrentH; ee232h.ADSlowSlew = Convert.ToBoolean(eedata.ADSlowSlewH); ee232h.ADSchmittInput = Convert.ToBoolean(eedata.ADSchmittInputH); ee232h.ADDriveCurrent = eedata.ADDriveCurrentH; ee232h.Cbus0 = eedata.Cbus0H; ee232h.Cbus1 = eedata.Cbus1H; ee232h.Cbus2 = eedata.Cbus2H; ee232h.Cbus3 = eedata.Cbus3H; ee232h.Cbus4 = eedata.Cbus4H; ee232h.Cbus5 = eedata.Cbus5H; ee232h.Cbus6 = eedata.Cbus6H; ee232h.Cbus7 = eedata.Cbus7H; ee232h.Cbus8 = eedata.Cbus8H; ee232h.Cbus9 = eedata.Cbus9H; ee232h.IsFifo = Convert.ToBoolean(eedata.IsFifoH); ee232h.IsFifoTar = Convert.ToBoolean(eedata.IsFifoTarH); ee232h.IsFastSer = Convert.ToBoolean(eedata.IsFastSerH); ee232h.IsFT1248 = Convert.ToBoolean(eedata.IsFT1248H); ee232h.FT1248Cpol = Convert.ToBoolean(eedata.FT1248CpolH); ee232h.FT1248Lsb = Convert.ToBoolean(eedata.FT1248LsbH); ee232h.FT1248FlowControl = Convert.ToBoolean(eedata.FT1248FlowControlH); ee232h.IsVCP = Convert.ToBoolean(eedata.IsVCPH); ee232h.PowerSaveEnable = Convert.ToBoolean(eedata.PowerSaveEnableH); } } else { if (pFT_EE_Read == IntPtr.Zero) { MessageBox.Show("Failed to load function FT_EE_Read."); } } return ftStatus; }