private void InitializeGpio(Ft4222Device device) { DeviceInformation = device; // Open device var ftStatus = FtFunction.FT_OpenEx(DeviceInformation.LocId, FtOpenType.OpenByLocation, out _ftHandle); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to open device {DeviceInformation.Description}, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetSuspendOut(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} changing Suspend out mode, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetWakeUpInterrupt(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} removing wake up interrupt, status: {ftStatus}"); } for (int i = 0; i < PinCountConst; i++) { _gpioDirections[i] = GpioPinMode.Output; } ftStatus = FtFunction.FT4222_GPIO_Init(_ftHandle, _gpioDirections); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description}, status: {ftStatus}"); } }
/// <inheritdoc/> protected override void SetPinMode(int pinNumber, PinMode mode) { _gpioDirections[pinNumber] = mode == PinMode.Output ? GpioPinMode.Output : GpioPinMode.Input; var status = FtFunction.FT4222_GPIO_Init(_ftHandle, _gpioDirections); if (status != FtStatus.Ok) { throw new IOException($"{nameof(SetPinMode)}: failed to set pin number {pinNumber} to {mode}, status: {status}"); } }
/// <summary> /// Create a FT4222 GPIO driver /// </summary> /// <param name="deviceNumber">Number of the device in the device list, default 0</param> public Ft4222Gpio(int deviceNumber = 0) { // Check device var devInfos = FtCommon.GetDevices(); if (devInfos.Count == 0) { throw new IOException("No FTDI device available"); } // Select the deviceNumber, only the last one in Mode 0 and Mode 1 can be open. // The last one is either B if in Mode 0 or D in mode 1. string strMode = devInfos[0].Type == FtDevice.Ft4222HMode1or2With4Interfaces ? "FT4222 D" : "FT4222 B"; var devInfo = devInfos.Where(m => m.Description == strMode).ToArray(); if ((devInfo.Length == 0) || (devInfo.Length < deviceNumber)) { throw new IOException($"Can't find a device to open GPIO on index {deviceNumber}"); } DeviceInformation = devInfo[deviceNumber]; // Open device var ftStatus = FtFunction.FT_OpenEx(DeviceInformation.LocId, FtOpenType.OpenByLocation, out _ftHandle); if (ftStatus != FtStatus.Ok) { throw new IOException($"Failed to open device {DeviceInformation.Description}, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetSuspendOut(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} changing Suspend out mode, status: {ftStatus}"); } ftStatus = FtFunction.FT4222_SetWakeUpInterrupt(_ftHandle, false); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description} removing wake up interrupt, status: {ftStatus}"); } for (int i = 0; i < PinCountConst; i++) { _gpioDirections[i] = GpioPinMode.Output; } ftStatus = FtFunction.FT4222_GPIO_Init(_ftHandle, _gpioDirections); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't initialize GPIO for device {DeviceInformation.Description}, status: {ftStatus}"); } }