/* ----------------------------------------------------------------------------
 *         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.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "slcdc.h"
#include <board.h>
#include <utility/assert.h>

#include <string.h>

//------------------------------------------------------------------------------
//         Local definitions
//------------------------------------------------------------------------------

/// Size of SLCDC buffer in bytes.
#define BUFFER_SIZE     320

//------------------------------------------------------------------------------
//         Global functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initializes the Segment LCD controller.
/// \param commons  Number of commons used by the display.
/// \param segments  Number of segments used by the display.
/// \param bias  Bias value.
/// \param timeSetting  Buffer timing value.
//------------------------------------------------------------------------------
void SLCDC_Configure(
    unsigned int commons,
    unsigned int segments,
    unsigned int bias,
    unsigned int timeSetting)
{
    SANITY_CHECK((commons > 0) && (commons <= 10));
    SANITY_CHECK((segments > 0) && (segments <= 40));
    SANITY_CHECK((bias & ~AT91C_SLCDC_BIAS) == 0);
    SANITY_CHECK((timeSetting & ~(0xF << 16)) == 0);  
    SANITY_CHECK((timeSetting >> 16) < 0x0A);

    // Enable peripheral clock
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SLCD;
    AT91C_BASE_SLCDC->SLCDC_MR = (commons - 1) | ((segments - 1) << 8) | bias | timeSetting;
}

//------------------------------------------------------------------------------
/// Clears the SLCD display buffer.
//------------------------------------------------------------------------------
void SLCDC_Clear(void)
{
    memset((void *) AT91C_BASE_SLCDC->SLCDC_MEM, 0, BUFFER_SIZE);
}

//------------------------------------------------------------------------------
/// Enables the SLCD controller.
//------------------------------------------------------------------------------
void SLCDC_Enable(void)
{
    AT91C_BASE_SLCDC->SLCDC_CR = AT91C_SLCDC_LCDEN;
    while (AT91C_BASE_SLCDC -> SLCDC_SR != AT91C_SLCDC_ENA);
}

//------------------------------------------------------------------------------
/// Disables the SLCD controller.
//------------------------------------------------------------------------------
void SLCDC_Disable(void)
{
    AT91C_BASE_SLCDC->SLCDC_CR = AT91C_SLCDC_LCDDIS;
}

//------------------------------------------------------------------------------
/// Enables the SLCD low power mode.
//------------------------------------------------------------------------------
void SLCDC_EnableLowPowerMode(void)
{
    unsigned int value;

    value = AT91C_BASE_SLCDC->SLCDC_MR;
    value &= ~AT91C_SLCDC_LPMODE;
    value |=AT91C_SLCDC_LPMODE;
    AT91C_BASE_SLCDC->SLCDC_MR = value;
}
 
//------------------------------------------------------------------------------
/// Disables the SLCD low power mode
//------------------------------------------------------------------------------
void SLCDC_DisableLowPowerMode(void)
{
    unsigned int value;

    value = AT91C_BASE_SLCDC->SLCDC_MR;
    value &= ~AT91C_SLCDC_LPMODE;
    AT91C_BASE_SLCDC->SLCDC_MR = value;
}

//------------------------------------------------------------------------------
/// Adjusts the frame frequency. Frequency = FsCLK / (prescaler * divider . NCOM)
/// \param prescalerValue  Prescaler value
/// \param dividerValue  Divider value
//------------------------------------------------------------------------------
void SLCDC_SetFrameFreq(unsigned int prescalerValue, unsigned int dividerValue)
{
    SANITY_CHECK((prescalerValue & ~AT91C_SLCDC_PRESC) == 0);
    SANITY_CHECK((dividerValue & (~(0x07 << 8))) == 0);

    AT91C_BASE_SLCDC->SLCDC_FRR = prescalerValue | dividerValue;
}

//------------------------------------------------------------------------------
/// Sets the display mode (normal/force off/force on/blinking).
/// \param mode  Display mode to be set
//------------------------------------------------------------------------------
void SLCDC_SetDisplayMode(unsigned int mode)
{
    unsigned int value;

    SANITY_CHECK(mode < 8);
           
    value = AT91C_BASE_SLCDC->SLCDC_DR;
    value &= ~AT91C_SLCDC_DISPMODE;
    value |= mode;
    AT91C_BASE_SLCDC->SLCDC_DR = value;
}

//------------------------------------------------------------------------------
/// Adjusts the display blinking frequency.
/// Blinking frequency = Frame Frequency / LCDBLKFREQ.
/// \param frequency  Frequency value.
//------------------------------------------------------------------------------
void SLCDC_SetBlinkFreq(unsigned int frequency)
{
    unsigned int value;

    SANITY_CHECK((frequency & ~(0xFF << 8)) == 0);

    value = AT91C_BASE_SLCDC->SLCDC_DR;
    value &= ~AT91C_SLCDC_BLKFREQ;
    value |= frequency;           
    AT91C_BASE_SLCDC->SLCDC_DR = frequency;
}

//------------------------------------------------------------------------------
/// Enables the selected SLCDC interrupt sources.
/// \param sources  Interrupt sources to enable.
//------------------------------------------------------------------------------
void SLCDC_EnableInterrupts(unsigned int sources)
{
    SANITY_CHECK((sources & 0xFFFFFFFA) == 0);

    AT91C_BASE_SLCDC->SLCDC_IER = sources;
}

//------------------------------------------------------------------------------
/// Disables the selected SLCDC interrupt sources.
/// \param sources  Interrupt sources to disable.
//------------------------------------------------------------------------------
void SLCDC_DisableInterrupts(unsigned int sources)
{
    SANITY_CHECK((sources & 0xFFFFFFFA) == 0);

    AT91C_BASE_SLCDC->SLCDC_IDR = sources;
}

