]> git.sur5r.net Git - freertos/blob - Demo/Common/drivers/Atmel/at91lib/peripherals/slcdc/slcdc.c
Atmel provided hardware specifics.
[freertos] / Demo / Common / drivers / Atmel / at91lib / peripherals / slcdc / slcdc.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 //------------------------------------------------------------------------------\r
31 //         Headers\r
32 //------------------------------------------------------------------------------\r
33 \r
34 #include "slcdc.h"\r
35 #include <board.h>\r
36 #include <utility/assert.h>\r
37 \r
38 #include <string.h>\r
39 \r
40 //------------------------------------------------------------------------------\r
41 //         Local definitions\r
42 //------------------------------------------------------------------------------\r
43 \r
44 /// Size of SLCDC buffer in bytes.\r
45 #define BUFFER_SIZE     320\r
46 \r
47 //------------------------------------------------------------------------------\r
48 //         Global functions\r
49 //------------------------------------------------------------------------------\r
50 \r
51 //------------------------------------------------------------------------------\r
52 /// Initializes the Segment LCD controller.\r
53 /// \param commons  Number of commons used by the display.\r
54 /// \param segments  Number of segments used by the display.\r
55 /// \param bias  Bias value.\r
56 /// \param timeSetting  Buffer timing value.\r
57 //------------------------------------------------------------------------------\r
58 void SLCDC_Configure(\r
59     unsigned int commons,\r
60     unsigned int segments,\r
61     unsigned int bias,\r
62     unsigned int timeSetting)\r
63 {\r
64     SANITY_CHECK((commons > 0) && (commons <= 10));\r
65     SANITY_CHECK((segments > 0) && (segments <= 40));\r
66     SANITY_CHECK((bias & ~AT91C_SLCDC_BIAS) == 0);\r
67         SANITY_CHECK((timeSetting & ~(0xF << 16)) == 0);  \r
68     SANITY_CHECK((timeSetting >> 16) < 0x0A);\r
69 \r
70     // Enable peripheral clock\r
71     AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SLCD;\r
72     AT91C_BASE_SLCDC->SLCDC_MR = (commons - 1) | ((segments - 1) << 8) | bias | timeSetting;\r
73 }\r
74 \r
75 //------------------------------------------------------------------------------\r
76 /// Clears the SLCD display buffer.\r
77 //------------------------------------------------------------------------------\r
78 void SLCDC_Clear(void)\r
79 {\r
80     memset((void *) AT91C_BASE_SLCDC->SLCDC_MEM, 0, BUFFER_SIZE);\r
81 }\r
82 \r
83 //------------------------------------------------------------------------------\r
84 /// Enables the SLCD controller.\r
85 //------------------------------------------------------------------------------\r
86 void SLCDC_Enable(void)\r
87 {\r
88     AT91C_BASE_SLCDC->SLCDC_CR = AT91C_SLCDC_LCDEN;\r
89     while (AT91C_BASE_SLCDC -> SLCDC_SR != AT91C_SLCDC_ENA);\r
90 }\r
91 \r
92 //------------------------------------------------------------------------------\r
93 /// Disables the SLCD controller.\r
94 //------------------------------------------------------------------------------\r
95 void SLCDC_Disable(void)\r
96 {\r
97     AT91C_BASE_SLCDC->SLCDC_CR = AT91C_SLCDC_LCDDIS;\r
98 }\r
99 \r
100 //------------------------------------------------------------------------------\r
101 /// Enables the SLCD low power mode.\r
102 //------------------------------------------------------------------------------\r
103 void SLCDC_EnableLowPowerMode(void)\r
104 {\r
105     unsigned int value;\r
106 \r
107     value = AT91C_BASE_SLCDC->SLCDC_MR;\r
108     value &= ~AT91C_SLCDC_LPMODE;\r
109     value |=AT91C_SLCDC_LPMODE;\r
110     AT91C_BASE_SLCDC->SLCDC_MR = value;\r
111 }\r
112  \r
113 //------------------------------------------------------------------------------\r
114 /// Disables the SLCD low power mode\r
115 //------------------------------------------------------------------------------\r
116 void SLCDC_DisableLowPowerMode(void)\r
117 {\r
118     unsigned int value;\r
119 \r
120     value = AT91C_BASE_SLCDC->SLCDC_MR;\r
121     value &= ~AT91C_SLCDC_LPMODE;\r
122     AT91C_BASE_SLCDC->SLCDC_MR = value;\r
123 }\r
124 \r
125 //------------------------------------------------------------------------------\r
126 /// Adjusts the frame frequency. Frequency = FsCLK / (prescaler * divider . NCOM)\r
127 /// \param prescalerValue  Prescaler value\r
128 /// \param dividerValue  Divider value\r
129 //------------------------------------------------------------------------------\r
130 void SLCDC_SetFrameFreq(unsigned int prescalerValue, unsigned int dividerValue)\r
131 {\r
132     SANITY_CHECK((prescalerValue & ~AT91C_SLCDC_PRESC) == 0);\r
133     SANITY_CHECK((dividerValue & (~(0x07 << 8))) == 0);\r
134 \r
135     AT91C_BASE_SLCDC->SLCDC_FRR = prescalerValue | dividerValue;\r
136 }\r
137 \r
138 //------------------------------------------------------------------------------\r
139 /// Sets the display mode (normal/force off/force on/blinking).\r
140 /// \param mode  Display mode to be set\r
141 //------------------------------------------------------------------------------\r
142 void SLCDC_SetDisplayMode(unsigned int mode)\r
143 {\r
144     unsigned int value;\r
145 \r
146     SANITY_CHECK(mode < 8);\r
147            \r
148     value = AT91C_BASE_SLCDC->SLCDC_DR;\r
149     value &= ~AT91C_SLCDC_DISPMODE;\r
150     value |= mode;\r
151     AT91C_BASE_SLCDC->SLCDC_DR = value;\r
152 }\r
153 \r
154 //------------------------------------------------------------------------------\r
155 /// Adjusts the display blinking frequency.\r
156 /// Blinking frequency = Frame Frequency / LCDBLKFREQ.\r
157 /// \param frequency  Frequency value.\r
158 //------------------------------------------------------------------------------\r
159 void SLCDC_SetBlinkFreq(unsigned int frequency)\r
160 {\r
161     unsigned int value;\r
162 \r
163     SANITY_CHECK((frequency & ~(0xFF << 8)) == 0);\r
164 \r
165     value = AT91C_BASE_SLCDC->SLCDC_DR;\r
166     value &= ~AT91C_SLCDC_BLKFREQ;\r
167     value |= frequency;           \r
168     AT91C_BASE_SLCDC->SLCDC_DR = frequency;\r
169 }\r
170 \r
171 //------------------------------------------------------------------------------\r
172 /// Enables the selected SLCDC interrupt sources.\r
173 /// \param sources  Interrupt sources to enable.\r
174 //------------------------------------------------------------------------------\r
175 void SLCDC_EnableInterrupts(unsigned int sources)\r
176 {\r
177     SANITY_CHECK((sources & 0xFFFFFFFA) == 0);\r
178 \r
179     AT91C_BASE_SLCDC->SLCDC_IER = sources;\r
180 }\r
181 \r
182 //------------------------------------------------------------------------------\r
183 /// Disables the selected SLCDC interrupt sources.\r
184 /// \param sources  Interrupt sources to disable.\r
185 //------------------------------------------------------------------------------\r
186 void SLCDC_DisableInterrupts(unsigned int sources)\r
187 {\r
188     SANITY_CHECK((sources & 0xFFFFFFFA) == 0);\r
189 \r
190     AT91C_BASE_SLCDC->SLCDC_IDR = sources;\r
191 }\r
192 \r