FTD2XX_NET.FTDI.WriteFT2232EEPROM C# (CSharp) Method

WriteFT2232EEPROM() public method

Writes the specified values to the EEPROM of an FT2232 device. Calls FT_EE_Program in FTD2XX DLL
If the strings are too long, they will be truncated to their maximum permitted lengths
Thrown when the current device does not match the type required by this method.
public WriteFT2232EEPROM ( FT2232_EEPROM_STRUCTURE ee2232 ) : FT_STATUS
ee2232 FT2232_EEPROM_STRUCTURE The EEPROM settings to be written to the device
return FT_STATUS
        public FT_STATUS WriteFT2232EEPROM(FT2232_EEPROM_STRUCTURE ee2232)
        {
            // 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 FT2232 that we are trying to write
                    GetDeviceType(ref DeviceType);
                    if (DeviceType != FT_DEVICE.FT_DEVICE_2232)
                    {
                        // If it is not, throw an exception
                        ftErrorCondition = FT_ERROR.FT_INCORRECT_DEVICE;
                        ErrorHandler(ftStatus, ftErrorCondition);
                    }

                    // Check for VID and PID of 0x0000
                    if ((ee2232.VendorID == 0x0000) | (ee2232.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 = 2;

                    // 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 (ee2232.Manufacturer.Length > 32)
                        ee2232.Manufacturer = ee2232.Manufacturer.Substring(0, 32);
                    if (ee2232.ManufacturerID.Length > 16)
                        ee2232.ManufacturerID = ee2232.ManufacturerID.Substring(0, 16);
                    if (ee2232.Description.Length > 64)
                        ee2232.Description = ee2232.Description.Substring(0, 64);
                    if (ee2232.SerialNumber.Length > 16)
                        ee2232.SerialNumber = ee2232.SerialNumber.Substring(0, 16);

                    // Set string values
                    eedata.Manufacturer = Marshal.StringToHGlobalAnsi(ee2232.Manufacturer);
                    eedata.ManufacturerID = Marshal.StringToHGlobalAnsi(ee2232.ManufacturerID);
                    eedata.Description = Marshal.StringToHGlobalAnsi(ee2232.Description);
                    eedata.SerialNumber = Marshal.StringToHGlobalAnsi(ee2232.SerialNumber);

                    // Map non-string elements to structure
                    // Standard elements
                    eedata.VendorID = ee2232.VendorID;
                    eedata.ProductID = ee2232.ProductID;
                    eedata.MaxPower = ee2232.MaxPower;
                    eedata.SelfPowered = Convert.ToUInt16(ee2232.SelfPowered);
                    eedata.RemoteWakeup = Convert.ToUInt16(ee2232.RemoteWakeup);
                    // 2232 specific fields
                    eedata.Rev5 = Convert.ToByte(true);
                    eedata.PullDownEnable5 = Convert.ToByte(ee2232.PullDownEnable);
                    eedata.SerNumEnable5 = Convert.ToByte(ee2232.SerNumEnable);
                    eedata.USBVersionEnable5 = Convert.ToByte(ee2232.USBVersionEnable);
                    eedata.USBVersion5 = ee2232.USBVersion;
                    eedata.AIsHighCurrent = Convert.ToByte(ee2232.AIsHighCurrent);
                    eedata.BIsHighCurrent = Convert.ToByte(ee2232.BIsHighCurrent);
                    eedata.IFAIsFifo = Convert.ToByte(ee2232.IFAIsFifo);
                    eedata.IFAIsFifoTar = Convert.ToByte(ee2232.IFAIsFifoTar);
                    eedata.IFAIsFastSer = Convert.ToByte(ee2232.IFAIsFastSer);
                    eedata.AIsVCP = Convert.ToByte(ee2232.AIsVCP);
                    eedata.IFBIsFifo = Convert.ToByte(ee2232.IFBIsFifo);
                    eedata.IFBIsFifoTar = Convert.ToByte(ee2232.IFBIsFifoTar);
                    eedata.IFBIsFastSer = Convert.ToByte(ee2232.IFBIsFastSer);
                    eedata.BIsVCP = Convert.ToByte(ee2232.BIsVCP);

                    // 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)
                {
                    LogB.Debug("FTD2XX: Failed to load function FT_EE_Program.");
                }
            }
            return ftStatus;
        }