// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ZIRCON_SYSTEM_DEV_SERIAL_FTDI_FTDI_MPSSE_H_
#define ZIRCON_SYSTEM_DEV_SERIAL_FTDI_FTDI_MPSSE_H_

#include <stdint.h>
#include <threads.h>

#include <vector>

#include <ddk/device.h>
#include <ddk/driver.h>
#include <ddktl/protocol/serialimpl.h>
#include <lib/sync/completion.h>
#include <lib/zx/event.h>
#include <lib/zx/time.h>
#include <zircon/types.h>

namespace ftdi_mpsse {

// This class represents FTDI's Multi-Process Synchronous Serial Engine.
// It is responsible for Reading and Writing to the underlying Serial driver.
// It is also responsible for doing setup work for things like GPIO pins
// and clock commands.
class Mpsse {
 public:
  enum Direction {
    IN,
    OUT,
  };
  enum Level {
    HIGH,
    LOW,
  };

  Mpsse(zx_device_t* parent) : ftdi_(parent) {}

  zx_status_t Init();
  zx_status_t IsValid() { return ftdi_.is_valid(); }
  zx_status_t Sync();
  zx_status_t Read(uint8_t* buf, size_t len);
  zx_status_t Write(uint8_t* buf, size_t len);

  zx_status_t SetGpio(int pin, Direction dir, Level lvl);
  void GpioWriteCommandToBuffer(size_t index, std::vector<uint8_t>* buffer, size_t* bytes_written);
  zx_status_t FlushGpio();

  zx_status_t SetClock(bool adaptive, bool three_phase, int hz);

 private:
  static void NotifyCallback(void* ctx, serial_state_t state);

  // Commands to set the GPIO pins levels and directions. Must be followed
  // by one byte of gpio levels and one byte of gpio directions. Lower pins
  // are pins 0-7 and higher pins are pins 8-15.
  static constexpr uint8_t kGpioSetCommandLowerPins = 0x80;
  static constexpr uint8_t kGpioSetCommandHigherPins = 0x82;

  static constexpr uint8_t kClockSetCommandByte1 = 0x8A;
  static constexpr uint8_t kClockSetCommandByte2 = 0x97;
  static constexpr uint8_t kClockSetCommandByte2AdaptiveOn = 0x96;
  static constexpr uint8_t kClockSetCommandByte3 = 0x8D;
  static constexpr uint8_t kClockSetCommandByte3ThreePhaseOn = 0x8C;
  static constexpr uint8_t kClockSetCommandByte4 = 0x86;

  static constexpr uint8_t kMpsseErrorInvalidCommand = 0xFA;

  static constexpr zx::duration kSerialReadWriteTimeout = zx::sec(1);
  static constexpr zx_signals_t kMpsseSignalReadable = ZX_USER_SIGNAL_0;
  static constexpr zx_signals_t kMpsseSignalWritable = ZX_USER_SIGNAL_1;

  ddk::SerialImplProtocolClient ftdi_ = {};
  uint16_t gpio_levels_ = 0;
  uint16_t gpio_directions_ = 0;

  sync_completion_t serial_readable_;
  sync_completion_t serial_writable_;
  serial_notify_t notify_cb_ = {};
};

}  // namespace ftdi_mpsse

#endif  // ZIRCON_SYSTEM_DEV_SERIAL_FTDI_FTDI_MPSSE_H_
