/* ---------------------------------------------------------------------------- */
/*                  Atmel Microcontroller Software Support                      */
/*                       SAM Software Package License                           */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) 2015, Atmel Corporation                                        */
/*                                                                              */
/* All rights reserved.                                                         */
/*                                                                              */
/* Redistribution and use in source and binary forms, with or without           */
/* modification, are permitted provided that the following condition is 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.                           */
/* ---------------------------------------------------------------------------- */

/** \file */

/** \addtogroup isi_module
 * @{
 * \section gmac_usage Usage
 * - ISI_Init: initialize ISI with default parameters
 * - ISI_EnableInterrupt: enable one or more interrupts
 * - ISI_DisableInterrupt: disable one or more interrupts
 * - ISI_Enable: enable isi module
 * - ISI_Disable: disable isi module
 * - ISI_CodecPathFull: enable codec path
 * - ISI_SetFrame: set frame rate
 * - ISI_BytesForOnePixel: return number of byte for one pixel
 * - ISI_StatusRegister: return ISI status register
 * - ISI_Reset: make a software reset
 */
/**@}*/

#ifndef ISI_H
#define ISI_H



/*----------------------------------------------------------------------------
 *        Definition
 *----------------------------------------------------------------------------*/
#define YUV_INPUT          0
#define RGB_INPUT          1
#define GRAYSCALE_INPUT    2

/*----------------------------------------------------------------------------
 *        Types
 *----------------------------------------------------------------------------*/

/** ISI descriptors */
typedef struct {
	/** Current LCD index, used with AT91C_ISI_MAX_PREV_BUFFER */
	uint32_t CurrentLcdIndex;
	/** set if Fifo Codec Empty is present */
	volatile uint32_t DisplayCodec;
	/** upgrade for each Fifo Codec Overflow (statistics use) */
	uint32_t nb_codec_ovf;
	/** upgrade for each Fifo Preview Overflow (statistics use) */
	uint32_t nb_prev_ovf;
} ISI_Descriptors;

/** Frame Buffer Descriptors */
typedef struct {
	/** Address of the Current FrameBuffer */
	uint32_t Current;
	/** Address of the Control */
	uint32_t Control;
	/** Address of the Next FrameBuffer */
	uint32_t Next;
} ISI_FrameBufferDescriptors;


/** ISI Matrix Color Space Conversion YCrCb to RGB */
typedef struct {
	/** Color Space Conversion Matrix Coefficient C0*/
	uint8_t C0;
	/** Color Space Conversion Matrix Coefficient C1 */
	uint8_t C1;
	/** Color Space Conversion Matrix Coefficient C2 */
	uint8_t C2;
	/** Color Space Conversion Matrix Coefficient C3 */
	uint8_t C3;
	/** Color Space Conversion Red Chrominance Default Offset */
	uint8_t Croff;
	/** Color Space Conversion Blue Chrominance Default Offset */
	uint8_t Cboff;
	/** Color Space Conversion Luminance Default Offset */
	uint8_t Yoff;
	/** Color Space Conversion Matrix Coefficient C4 */
	uint16_t C4;
} ISI_Y2R;

/** ISI Matrix Color Space Conversion RGB to YCrCb */
typedef struct {
	/** Color Space Conversion Matrix Coefficient C0*/
	uint8_t C0;
	/** Color Space Conversion Matrix Coefficient C1 */
	uint8_t C1;
	/** Color Space Conversion Matrix Coefficient C2 */
	uint8_t C2;
	/** Color Space Conversion Red Component Offset */
	uint8_t Roff;
	/** Color Space Conversion Matrix Coefficient C3*/
	uint8_t C3;
	/** Color Space Conversion Matrix Coefficient C4 */
	uint8_t C4;
	/** Color Space Conversion Matrix Coefficient C5 */
	uint8_t C5;
	/** Color Space Conversion Green Component Offset */
	uint8_t Goff;
	/** Color Space Conversion Matrix Coefficient C6*/
	uint8_t C6;
	/** Color Space Conversion Matrix Coefficient C7 */
	uint8_t C7;
	/** Color Space Conversion Matrix Coefficient C8 */
	uint8_t C8;
	/** Color Space Conversion Blue Component Offset */
	uint8_t Boff;
} ISI_R2Y;

/*----------------------------------------------------------------------------
 *         Exported functions
 *----------------------------------------------------------------------------*/
extern void ISI_Enable(void);

extern void ISI_Disable(void);

void ISI_DmaChannelEnable(uint32_t channel);

void ISI_DmaChannelDisable(uint32_t channel);

extern void ISI_EnableInterrupt(uint32_t flag);

extern void ISI_DisableInterrupt(uint32_t flag);

extern void ISI_CodecPathFull(void);

extern void ISI_SetFrameRate(uint32_t frame);

extern uint8_t ISI_BytesForOnePixel(uint8_t bmpRgb);

extern void ISI_Reset(void);

extern void ISI_Init(pIsi_Video pVideo);

extern uint32_t ISI_StatusRegister(void);

extern void ISI_SetBlank(
	uint8_t hBlank,
	uint8_t vBlank);

extern void ISI_SetSensorSize(
	uint32_t hSize,
	uint32_t vSize);

extern void ISI_RgbPixelMapping(uint32_t wRgbPixelMapping);

extern void ISI_RgbSwapMode(uint32_t swapMode);

extern void ISI_YCrCbFormat(uint32_t wYuvSwapMode);

extern void ISI_setGrayScaleMode(uint32_t wPixelFormat);

extern void ISI_setInputStream(uint32_t wStreamMode);

extern void ISI_setPreviewSize(
	uint32_t hSize,
	uint32_t vSize);

extern void ISI_calcScalerFactor(void);

extern void ISI_setDmaInPreviewPath(
	uint32_t baseFrameBufDesc,
	uint32_t dmaCtrl,
	uint32_t frameBufferStartAddr);

extern void ISI_setDmaInCodecPath(
	uint32_t baseFrameBufDesc,
	uint32_t dmaCtrl,
	uint32_t frameBufferStartAddr);

extern void ISI_SetMatrix4Yuv2Rgb (ISI_Y2R *yuv2rgb);
extern void ISI_SetMatrix4Rgb2Yuv (ISI_R2Y *rgb2yuv);

#endif //#ifndef ISI_H

