From 044ad7c3987460ede48ff27afd6bdb0ca05a0432 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 4 Jul 2011 20:52:54 +0200 Subject: import at91lib from at91lib_20100901_softpack_1_9_v_1_0_svn_v15011 it's sad to see that atmel doesn't publish their svn repo or has a centralized location or even puts proper version/release info into the library itself --- peripherals/slcdc/slcdc.c | 192 ++++++++++++++++++++++++++++++++++++++++++++ peripherals/slcdc/slcdc.dir | 35 ++++++++ peripherals/slcdc/slcdc.h | 93 +++++++++++++++++++++ 3 files changed, 320 insertions(+) create mode 100644 peripherals/slcdc/slcdc.c create mode 100644 peripherals/slcdc/slcdc.dir create mode 100644 peripherals/slcdc/slcdc.h (limited to 'peripherals/slcdc') diff --git a/peripherals/slcdc/slcdc.c b/peripherals/slcdc/slcdc.c new file mode 100644 index 0000000..59fc238 --- /dev/null +++ b/peripherals/slcdc/slcdc.c @@ -0,0 +1,192 @@ +/* ---------------------------------------------------------------------------- + * 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 +#include + +#include + +//------------------------------------------------------------------------------ +// 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; +} + diff --git a/peripherals/slcdc/slcdc.dir b/peripherals/slcdc/slcdc.dir new file mode 100644 index 0000000..08baa6f --- /dev/null +++ b/peripherals/slcdc/slcdc.dir @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------------- + * 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. + * ---------------------------------------------------------------------------- + */ + +//------------------------------------------------------------------------------ +/// \dir +/// !!!Purpose +/// +/// Contains the peripheral API for Segment LCD Controller (SLCDC) controller. +//------------------------------------------------------------------------------ diff --git a/peripherals/slcdc/slcdc.h b/peripherals/slcdc/slcdc.h new file mode 100644 index 0000000..2b18960 --- /dev/null +++ b/peripherals/slcdc/slcdc.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + * 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 Segment LCD Controller (SLCDC) peripheral. +/// +/// !Usage +/// +/// -# Initializes the Segment LCD controller using SLCDC_Configure(). +/// -# Clears the SLCD display buffer using SLCDC_Clear(). +/// -# Enable & disable SLCD controller using SLCDC_Enable() and SLCDC_Disable(). +/// -# Enables & disable the SLCD low power mode using SLCDC_EnableLowPowerMode () +/// and SLCDC_DisableLowPowerMode(). +/// -# Adjusts the frame frequency using SLCDC_SetFrameFreq(). +/// -# Sets the display mode (normal/force off/force on/blinking) using +/// SLCDC_SetDisplayMode(). +/// -# Adjusts the display blinking frequency using SLCDC_SetBlinkFreq(). +/// -# Enables & disable the selected SLCDC interrupt sources using +/// SLCDC_EnableInterrupts() and SLCDC_DisableInterrupts(). +//------------------------------------------------------------------------------ + +#ifndef SLCDC_H +#define SLCDC_H + +//------------------------------------------------------------------------------ +// Global definitions +//------------------------------------------------------------------------------ + +/// Number of segments in SLCD. +#define S7LEKLCD_NUM_SEGMENTS 40 +/// Number of commons in SLCD. +#define S7LEKLCD_NUM_COMMONS 10 + +//------------------------------------------------------------------------------ +// Global functions +//------------------------------------------------------------------------------ + +extern void SLCDC_Configure( + unsigned int commons, + unsigned int segments, + unsigned int bias, + unsigned int timeSetting); + +extern void SLCDC_Clear(void); + +extern void SLCDC_Enable(void); + +extern void SLCDC_Disable(void); + +extern void SLCDC_SetFrameFreq( + unsigned int prescalerValue, + unsigned int dividerValue); + +extern void SLCDC_SetDisplayMode(unsigned int mode); + +extern void SLCDC_SetBlinkFreq(unsigned int frequency); + +extern void SLCDC_EnableInterrupts(unsigned int sources); + +extern void SLCDC_DisableInterrupts(unsigned int sources); + +#endif //#ifndef SLCDC_H + -- cgit v1.2.3