/*****************
 * resolutions.h *
 *****************/

/****************************************************************************
 *   Written By Mark Pelletier  2019 - Aleph Objects, Inc.                  *
 *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
 *                                                                          *
 *   This program is free software: you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by   *
 *   the Free Software Foundation, either version 3 of the License, or      *
 *   (at your option) any later version.                                    *
 *                                                                          *
 *   This program is distributed in the hope that it will be useful,        *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
 *   GNU General Public License for more details.                           *
 *                                                                          *
 *   To view a copy of the GNU General Public License, go to the following  *
 *   location: <https://www.gnu.org/licenses/>.                             *
 ****************************************************************************/

#pragma once

/***
 * The FT8xx has odd registers that don't correspond to timing values in
 * display datasheets. This macro computes the register values using the
 * formulas given in the document:
 *
 *     Bridgetek Application Note
 *     AN_336 FT8xx
 *     Selecting an LCD Display
 *     Version 2.1
 *     Issue Date: 2017-11-14
 */
#define COMPUTE_REGS_FROM_DATASHEET \
    constexpr uint16_t Hoffset              = thfp + thb - 1; \
    constexpr uint16_t Hcycle               = th; \
    constexpr uint16_t Hsync0               = thfp - 1 ; \
    constexpr uint16_t Hsync1               = thfp + thpw - 1; \
    constexpr uint16_t Voffset              = tvfp + tvb - 1; \
    constexpr uint16_t Vcycle               = tv; \
    constexpr uint16_t Vsync0               = tvfp - 1; \
    constexpr uint16_t Vsync1               = tvfp + tvpw - 1; \
    static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \
    static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv")

#if ENABLED(TOUCH_UI_320x240)
  namespace FTDI {
    constexpr uint8_t Pclk                 =    8;
    constexpr uint8_t Pclkpol              =    0;
    constexpr uint16_t Hsize               =  320;
    constexpr uint16_t Vsize               =  240;
    constexpr uint16_t Vsync0              =    0;
    constexpr uint16_t Vsync1              =    2;
    constexpr uint16_t Voffset             =   13;
    constexpr uint16_t Vcycle              =  263;
    constexpr uint16_t Hsync0              =    0;
    constexpr uint16_t Hsync1              =   10;
    constexpr uint16_t Hoffset             =   70;
    constexpr uint16_t Hcycle              =  408;

    constexpr uint32_t default_transform_a =  0x000054AD;
    constexpr uint32_t default_transform_b =  0xFFFFFF52;
    constexpr uint32_t default_transform_c =  0xFFF7F6E4;
    constexpr uint32_t default_transform_d =  0x00000065;
    constexpr uint32_t default_transform_e =  0xFFFFBE3B;
    constexpr uint32_t default_transform_f =  0x00F68E75;
  }

#elif defined(TOUCH_UI_480x272)
  namespace FTDI {
    constexpr uint8_t  Pclk                 =    7;
    constexpr uint8_t  Pclkpol              =    1;
    constexpr uint16_t Hsize                =  480;
    constexpr uint16_t Vsize                =  272;

    constexpr uint16_t th                   =  525; // One horizontal line
    constexpr uint16_t thfp                 =   43; // HS Front porch
    constexpr uint16_t thb                  =    2; // HS Back porch (blanking)
    constexpr uint16_t thpw                 =   41; // HS pulse width

    constexpr uint16_t tv                   =  286; // Vertical period time
    constexpr uint16_t tvfp                 =   12; // VS Front porch
    constexpr uint16_t tvb                  =    2; // VS Back porch (blanking)
    constexpr uint16_t tvpw                 =   10; // VS pulse width

    COMPUTE_REGS_FROM_DATASHEET;

    constexpr uint32_t default_transform_a  =  0x00008100;
    constexpr uint32_t default_transform_b  =  0x00000000;
    constexpr uint32_t default_transform_c  =  0xFFF18000;
    constexpr uint32_t default_transform_d  =  0x00000000;
    constexpr uint32_t default_transform_e  =  0xFFFFB100;
    constexpr uint32_t default_transform_f  =  0x0120D000;
  }

#elif defined(TOUCH_UI_800x480)
  namespace FTDI {
    #if defined(TOUCH_UI_800x480_GENERIC)
      constexpr uint8_t Pclk                 =    2;
      constexpr uint16_t Hsize               =  800;
      constexpr uint16_t Vsize               =  480;

      constexpr uint16_t Vsync0              =    0;
      constexpr uint16_t Vsync1              =    3;
      constexpr uint16_t Voffset             =   32;
      constexpr uint16_t Vcycle              =  525;
      constexpr uint16_t Hsync0              =    0;
      constexpr uint16_t Hsync1              =   48;
      constexpr uint16_t Hoffset             =   88;
      constexpr uint16_t Hcycle              =  928;
    #else
      constexpr uint8_t  Pclk                =    3;
      constexpr uint8_t  Pclkpol             =    1;
      constexpr uint16_t Hsize               =  800;
      constexpr uint16_t Vsize               =  480;

      constexpr uint16_t th                  = 1056; // One horizontal line
      constexpr uint16_t thfp                =  210; // HS Front porch
      constexpr uint16_t thb                 =   46; // HS Back porch (blanking)
      constexpr uint16_t thpw                =   23; // HS pulse width

      constexpr uint16_t tv                  =  525; // Vertical period time
      constexpr uint16_t tvfp                =   22; // VS Front porch
      constexpr uint16_t tvb                 =   23; // VS Back porch (blanking)
      constexpr uint16_t tvpw                =   10; // VS pulse width

      COMPUTE_REGS_FROM_DATASHEET;

      constexpr uint32_t default_transform_a  =  0x0000D8B9;
      constexpr uint32_t default_transform_b  =  0x00000124;
      constexpr uint32_t default_transform_c  =  0xFFE23926;
      constexpr uint32_t default_transform_d  =  0xFFFFFF51;
      constexpr uint32_t default_transform_e  =  0xFFFF7E4F;
      constexpr uint32_t default_transform_f  =  0x01F0AF70;
    #endif
  }

#else
  #error "Unknown or no TOUCH_UI_FTDI_EVE display resolution specified. To add a display resolution, modify 'ftdi_eve_resolutions.h'."
#endif
