/**********************************************************************
* $Id: lpc_lcd.h 3001 2013-01-23 21:47:55Z andy $      lpc_lcd.h           2011-10-14
*//**
* @file     lpc_lcd.h
* @brief    Contains all functions support for LCD firmware library
*           on LPC
* @version  1.0
* @date     14. October. 2011
* @author   NXP MCU SW Application Team
* 
* Copyright(C) 2011, NXP Semiconductor
* All rights reserved.
*
***********************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors'
* relevant copyright in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers.  This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
**********************************************************************/
#include "lpc_types.h"

#ifndef __LPC_LCD_H_
#define __LPC_LCD_H_

/** @defgroup LCD   LCD (Liquid Crystal Display)
 * @ingroup LPC_CMSIS_FwLib_Drivers
 * @{
 */

/** @defgroup LCD_Public_Macros LCD Public Macros
 * @{
 */

#define LCD_PWR_ENA_DIS_DLY  10000
#define LCD_FUNC_OK  0
#define LCD_FUNC_ERR -1

#define GET_CURSOR_IMG_SIZE(size)  ((size == 32) ? 64:256)

/**
 * @}
 */

/** @defgroup LCD_Public_Types LCD Public Types
 * @{
 */

typedef enum __LCD_TYPES
{
  LCD_STN_MONOCHROME,
  LCD_STN_COLOR,
  LCD_TFT,
  LCD_TYPE_UNKNOWN,
} LCD_TYPES;

typedef enum __LCD_BPP
{
  LCD_BPP_1 = 0x00,
  LCD_BPP_2 = 0x01,
  LCD_BPP_4 = 0x02,
  LCD_BPP_8 = 0x03,
  LCD_BPP_16 = 0x04,
  LCD_BPP_24 = 0x05,
  LCD_BPP_16_565Mode = 0x06,
  LCD_BPP_12_444Mode = 0x07,
} LCD_BPP;

typedef enum __LCD_PANEL
{
  LCD_PANEL_UPPER,
  LCD_PANEL_LOWER,
}LCD_PANEL;

/**
 * @brief A struct for Bitmap on LCD screen
 */
typedef struct _Bmp_t 
{
  uint32_t  H_Size;
  uint32_t  V_Size;
  uint32_t  BitsPP;
  uint32_t  BytesPP;
  uint8_t *pPalette;
  uint8_t *pPicStream;
  uint8_t *pPicDesc;
} Bmp_t, *pBmp_t;

/**
 * @brief A struct for Font Type on LCD screen
 */
 
typedef struct _FontType_t 
{
  uint32_t H_Size;
  uint32_t V_Size;
  uint32_t CharacterOffset;
  uint32_t CharactersNuber;
  uint8_t *pFontStream;
  uint8_t *pFontDesc;
} FontType_t, *pFontType_t;

/**
 * @brief A struct for LCD Palette
 */

typedef struct __LCD_PALETTE_Type
{
    uint8_t Red;
    uint8_t Green;
    uint8_t Blue;
}LCD_PALETTE_Type, *pLCD_PALETTE_Type;

/**
 * @brief A struct for Horizontal configuration
 */

typedef struct __LCD_HConfig_Type
{
  uint8_t hfp;  // Horizontal front porch
  uint8_t hbp;  // Horizontal back porch
  uint8_t hsw;  // Horizontal synchronization pulse width
  uint16_t ppl;  // Number of pixels per line
}LCD_HConfig_Type;

/**
 * @brief A struct for Vertical configuration
 */

typedef struct __LCD_VConfig_Type
{
  uint8_t vfp;  // Vertical front and back porch
  uint8_t vbp;  // Vertical back porch
  uint8_t vsw;  // Vertical synchronization pulse width
  uint16_t lpp; // Number of lines per panel
}LCD_VConfig_Type;

/**
 * @brief A struct for Polarity configuration
 */

typedef struct __LCD_POLARITY_Type
{
    uint16_t cpl; // Number of pixel clocks per line 
    uint8_t  active_high; // Signal polarity, active HIGH or LOW
    uint8_t acb;  // AC bias pin frequency
    uint8_t  invert_panel_clock;   // Invert Panel clock;
    uint8_t  invert_hsync;          // Invert HSYNC
    uint8_t  invert_vsync;          // Invert VSYSNC
}LCD_POLARITY_Type;

/**
 * @brief A struct for LCD Configuration
 */

typedef struct __LCD_Config_Type
{
  LCD_HConfig_Type hConfig; // Horizontal config
  LCD_VConfig_Type vConfig; // Vertical config
  LCD_POLARITY_Type polarity; // Polarity config
  uint32_t panel_clk; // Panel clock frequency
  LCD_BPP lcd_bpp;   // Bits-per-pixel
  LCD_TYPES lcd_type; // Display type: STN monochrome, STN color, or TFT
  uint8_t   lcd_mono8; // STN 4 or 8-bit interface mode
  uint8_t   lcd_dual;  // STN dual or single panel mode
  uint8_t   big_endian_byte; // byte ordering in memory
  uint8_t   big_endian_pixel; // pixel ordering within a byte
  uint32_t  lcd_panel_upper;  // base address of frame buffer
  uint32_t  lcd_panel_lower;  // base address of frame buffer
  uint8_t*  lcd_palette;      // point to palette buffer
  Bool      lcd_bgr;          // False: RGB , TRUE: BGR
} LCD_Config_Type;

/**
 * @brief A struct for Cursor configuration
 */

typedef struct __LCD_Cursor_Config_Type
{
   uint8_t size32;              // 32x32 or 64x64
   uint8_t framesync;
   LCD_PALETTE_Type palette[2];
   uint32_t   baseaddress;
} LCD_Cursor_Config_Type;

typedef uint32_t LcdPixel_t, *pLcdPixel_t;
typedef int32_t  LCD_RET_CODE;

/**
 * @}
 */


/** @defgroup LCD_Public_Functions LCD Public Functions
 * @{
 */

LCD_RET_CODE LCD_Init (LCD_Config_Type* pConfig);
void LCD_SetBaseAddress(LCD_PANEL panel, uint32_t pAddress);
void LCD_SetPalette (const uint8_t* pPallete);
void LCD_Enable (Bool bEna);
void LCD_Cursor_Cfg(LCD_Cursor_Config_Type* pConfig);
void LCD_Cursor_Enable(int enable, int cursor);
void LCD_Move_Cursor(int x, int y);
void LCD_Cursor_SetImage (const uint32_t *pCursor, int cursor, int size);
void LCD_SetImage(LCD_PANEL panel,const uint8_t *pPain);
void LCD_FillRect (LCD_PANEL panel, uint32_t startx,uint32_t endx, 
                                        uint32_t starty, uint32_t endy,
                                        LcdPixel_t color);
void LCD_PutPixel (LCD_PANEL panel, uint32_t X_Left, uint32_t Y_Up, LcdPixel_t color);
void LCD_LoadPic (LCD_PANEL panel,uint32_t X_Left, uint32_t Y_Up, Bmp_t * pBmp, uint32_t Mask);

/**
 * @}
 */

#endif // __LPC_LCD_H_
/**
 * @}
 */

