public FT_STATUS ReadFT2232HEEPROM(FT2232H_EEPROM_STRUCTURE ee2232h)
{
// 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 FT2232H that we are trying to read
GetDeviceType(ref DeviceType);
if (DeviceType != FT_DEVICE.FT_DEVICE_2232H)
{
// 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 = 3;
// 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
ee2232h.Manufacturer = Marshal.PtrToStringAnsi(eedata.Manufacturer);
ee2232h.ManufacturerID = Marshal.PtrToStringAnsi(eedata.ManufacturerID);
ee2232h.Description = Marshal.PtrToStringAnsi(eedata.Description);
ee2232h.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
ee2232h.VendorID = eedata.VendorID;
ee2232h.ProductID = eedata.ProductID;
ee2232h.MaxPower = eedata.MaxPower;
ee2232h.SelfPowered = Convert.ToBoolean(eedata.SelfPowered);
ee2232h.RemoteWakeup = Convert.ToBoolean(eedata.RemoteWakeup);
// 2232H specific fields
ee2232h.PullDownEnable = Convert.ToBoolean(eedata.PullDownEnable7);
ee2232h.SerNumEnable = Convert.ToBoolean(eedata.SerNumEnable7);
ee2232h.ALSlowSlew = Convert.ToBoolean(eedata.ALSlowSlew);
ee2232h.ALSchmittInput = Convert.ToBoolean(eedata.ALSchmittInput);
ee2232h.ALDriveCurrent = eedata.ALDriveCurrent;
ee2232h.AHSlowSlew = Convert.ToBoolean(eedata.AHSlowSlew);
ee2232h.AHSchmittInput = Convert.ToBoolean(eedata.AHSchmittInput);
ee2232h.AHDriveCurrent = eedata.AHDriveCurrent;
ee2232h.BLSlowSlew = Convert.ToBoolean(eedata.BLSlowSlew);
ee2232h.BLSchmittInput = Convert.ToBoolean(eedata.BLSchmittInput);
ee2232h.BLDriveCurrent = eedata.BLDriveCurrent;
ee2232h.BHSlowSlew = Convert.ToBoolean(eedata.BHSlowSlew);
ee2232h.BHSchmittInput = Convert.ToBoolean(eedata.BHSchmittInput);
ee2232h.BHDriveCurrent = eedata.BHDriveCurrent;
ee2232h.IFAIsFifo = Convert.ToBoolean(eedata.IFAIsFifo7);
ee2232h.IFAIsFifoTar = Convert.ToBoolean(eedata.IFAIsFifoTar7);
ee2232h.IFAIsFastSer = Convert.ToBoolean(eedata.IFAIsFastSer7);
ee2232h.AIsVCP = Convert.ToBoolean(eedata.AIsVCP7);
ee2232h.IFBIsFifo = Convert.ToBoolean(eedata.IFBIsFifo7);
ee2232h.IFBIsFifoTar = Convert.ToBoolean(eedata.IFBIsFifoTar7);
ee2232h.IFBIsFastSer = Convert.ToBoolean(eedata.IFBIsFastSer7);
ee2232h.BIsVCP = Convert.ToBoolean(eedata.BIsVCP7);
ee2232h.PowerSaveEnable = Convert.ToBoolean(eedata.PowerSaveEnable);
}
}
else
{
if (pFT_EE_Read == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_EE_Read.");
}
}
return ftStatus;
}