/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
/// \unit
///
/// !Purpose
///
/// Interface for configuration the LCD Controller (LCDC) peripheral.
///
/// !Usage
///
/// -# Decode the RGB file to designated buffer using LCD_DecodeRGB().
/// -# Sets the address of the frame buffer in the LCD controller DMA using
/// LCD_SetFrameBufferAddress().
/// -# LCD Configuration functions prefixed with "LCD_Set" refer to 
/// the functions in the #Overview# tab.
/// 
/// Please refer to the list of functions in the #Overview# tab of this unit
/// for more detailed information.
//------------------------------------------------------------------------------

#ifndef LCD_H
#define LCD_H

//------------------------------------------------------------------------------
//         Exported functions
//------------------------------------------------------------------------------

extern void LCD_Enable(unsigned int frames);

extern void LCD_Disable(unsigned int frames);

extern void LCD_EnableDma(void);

extern void LCD_DisableDma(void);

extern void LCD_EnableInterrupts(unsigned int sources);

extern void LCD_SetPixelClock(unsigned int masterClock, unsigned int pixelClock);

extern void LCD_SetDisplayType(unsigned int displayType);

extern void LCD_SetScanMode(unsigned int scanMode);

extern void LCD_SetBitsPerPixel(unsigned int bitsPerPixel);

extern void LCD_SetPolarities(
    unsigned int lcdd,
    unsigned int lcdvsync,
    unsigned int lcdhsync,
    unsigned int lcddotclk,
    unsigned int lcdden);

extern void LCD_SetClockMode(unsigned int clockMode);

extern void LCD_SetMemoryFormat(unsigned int format);

extern void LCD_SetSize(unsigned int width, unsigned int height);

extern void LCD_SetVerticalTimings(
    unsigned int vfp,
    unsigned int vbp,
    unsigned int vpw,
    unsigned int vhdly);

extern void LCD_SetHorizontalTimings(
    unsigned int hbp,
    unsigned int hpw,
    unsigned int hfp);

extern void* LCD_SetFrameBufferAddress(void *address);

extern void LCD_SetFrameSize(unsigned int frameSize);

extern void LCD_SetBurstLength(unsigned int burstLength);

extern void LCD_SetContrastPrescaler(unsigned int prescaler);

extern void LCD_SetContrastPolarity(unsigned int polarity);

extern void LCD_SetContrastValue(unsigned int value);

extern void LCD_EnableContrast(void);

extern void LCD_SetPixelClock(unsigned int masterClock, unsigned int pixelClock);

extern void LCD_DMAReset(void);

extern void LCD_DecodeRGB(
    unsigned char *file,
    unsigned char *bufferLCD,
    unsigned int width,
    unsigned int height,
    unsigned char bpp);

#endif //#ifndef LCD_H

