| /* ---------------------------------------------------------------------------- | |
| * 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; | |
| } | |