1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald * All rights reserved.
4*5fd0122aSMatthias Ringwald *
5*5fd0122aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald * are met:
8*5fd0122aSMatthias Ringwald *
9*5fd0122aSMatthias Ringwald * * Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald *
12*5fd0122aSMatthias Ringwald * * Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald * documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald *
16*5fd0122aSMatthias Ringwald * * Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald * its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald * from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald *
20*5fd0122aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <stdint.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/lcd_f.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
35*5fd0122aSMatthias Ringwald
36*5fd0122aSMatthias Ringwald /* Define to ensure that our current MSP432 has the LCD_F module. This
37*5fd0122aSMatthias Ringwald definition is included in the device specific header file */
38*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_LCD_F__
39*5fd0122aSMatthias Ringwald
40*5fd0122aSMatthias Ringwald /* Configuration functions */
LCD_F_initModule(LCD_F_Config * initParams)41*5fd0122aSMatthias Ringwald void LCD_F_initModule(LCD_F_Config *initParams)
42*5fd0122aSMatthias Ringwald {
43*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL,LCD_F_CTL_ON_OFS) = 0;
44*5fd0122aSMatthias Ringwald
45*5fd0122aSMatthias Ringwald LCD_F->CTL = (LCD_F->CTL
46*5fd0122aSMatthias Ringwald & ~(LCD_F_CTL_MX_MASK | LCD_F_CTL_SSEL_MASK | LCD_F_CTL_LP
47*5fd0122aSMatthias Ringwald | LCD_F_CTL_ON | LCD_F_CTL_DIV_MASK | LCD_F_CTL_PRE_MASK
48*5fd0122aSMatthias Ringwald | LCD_F_CTL_SON))
49*5fd0122aSMatthias Ringwald | (initParams->muxRate | initParams->clockSource
50*5fd0122aSMatthias Ringwald | initParams->waveforms | initParams->segments
51*5fd0122aSMatthias Ringwald | initParams->clockDivider | initParams->clockPrescaler);
52*5fd0122aSMatthias Ringwald }
53*5fd0122aSMatthias Ringwald
LCD_F_turnOn(void)54*5fd0122aSMatthias Ringwald void LCD_F_turnOn(void)
55*5fd0122aSMatthias Ringwald {
56*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 1;
57*5fd0122aSMatthias Ringwald }
58*5fd0122aSMatthias Ringwald
LCD_F_turnOff(void)59*5fd0122aSMatthias Ringwald void LCD_F_turnOff(void)
60*5fd0122aSMatthias Ringwald {
61*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
62*5fd0122aSMatthias Ringwald }
63*5fd0122aSMatthias Ringwald
64*5fd0122aSMatthias Ringwald /* Memory management functions */
LCD_F_clearAllMemory(void)65*5fd0122aSMatthias Ringwald void LCD_F_clearAllMemory(void)
66*5fd0122aSMatthias Ringwald {
67*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->BMCTL , LCD_F_BMCTL_CLRM_OFS) = 1;
68*5fd0122aSMatthias Ringwald }
69*5fd0122aSMatthias Ringwald
LCD_F_clearAllBlinkingMemory(void)70*5fd0122aSMatthias Ringwald void LCD_F_clearAllBlinkingMemory(void)
71*5fd0122aSMatthias Ringwald {
72*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->BMCTL , LCD_F_BMCTL_CLRBM_OFS) = 1;
73*5fd0122aSMatthias Ringwald }
74*5fd0122aSMatthias Ringwald
LCD_F_selectDisplayMemory(uint_fast16_t displayMemory)75*5fd0122aSMatthias Ringwald void LCD_F_selectDisplayMemory(uint_fast16_t displayMemory)
76*5fd0122aSMatthias Ringwald {
77*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->BMCTL , LCD_F_BMCTL_DISP_OFS) = displayMemory;
78*5fd0122aSMatthias Ringwald }
79*5fd0122aSMatthias Ringwald
LCD_F_setBlinkingControl(uint_fast16_t clockPrescalar,uint_fast16_t divider,uint_fast16_t mode)80*5fd0122aSMatthias Ringwald void LCD_F_setBlinkingControl(uint_fast16_t clockPrescalar,
81*5fd0122aSMatthias Ringwald uint_fast16_t divider, uint_fast16_t mode)
82*5fd0122aSMatthias Ringwald {
83*5fd0122aSMatthias Ringwald LCD_F->BMCTL = (LCD_F->BMCTL
84*5fd0122aSMatthias Ringwald & ~(LCD_F_BMCTL_BLKPRE_MASK | LCD_F_BMCTL_BLKDIV_MASK
85*5fd0122aSMatthias Ringwald | LCD_F_BMCTL_BLKMOD_MASK)) | clockPrescalar | mode
86*5fd0122aSMatthias Ringwald | divider;
87*5fd0122aSMatthias Ringwald }
88*5fd0122aSMatthias Ringwald
LCD_F_setAnimationControl(uint_fast16_t clockPrescalar,uint_fast16_t divider,uint_fast16_t frames)89*5fd0122aSMatthias Ringwald void LCD_F_setAnimationControl(uint_fast16_t clockPrescalar,
90*5fd0122aSMatthias Ringwald uint_fast16_t divider, uint_fast16_t frames)
91*5fd0122aSMatthias Ringwald {
92*5fd0122aSMatthias Ringwald LCD_F->ANMCTL = (LCD_F->ANMCTL
93*5fd0122aSMatthias Ringwald & ~(LCD_F_ANMCTL_ANMPRE_MASK | LCD_F_ANMCTL_ANMDIV_MASK
94*5fd0122aSMatthias Ringwald | LCD_F_ANMCTL_ANMSTP_MASK)) | clockPrescalar | divider
95*5fd0122aSMatthias Ringwald | frames;
96*5fd0122aSMatthias Ringwald }
97*5fd0122aSMatthias Ringwald
LCD_F_enableAnimation(void)98*5fd0122aSMatthias Ringwald void LCD_F_enableAnimation(void)
99*5fd0122aSMatthias Ringwald {
100*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->ANMCTL, LCD_F_ANMCTL_ANMEN_OFS) = 1;
101*5fd0122aSMatthias Ringwald }
102*5fd0122aSMatthias Ringwald
LCD_F_disableAnimation(void)103*5fd0122aSMatthias Ringwald void LCD_F_disableAnimation(void)
104*5fd0122aSMatthias Ringwald {
105*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->ANMCTL, LCD_F_ANMCTL_ANMEN_OFS) = 0;
106*5fd0122aSMatthias Ringwald }
107*5fd0122aSMatthias Ringwald
LCD_F_clearAllAnimationMemory(void)108*5fd0122aSMatthias Ringwald void LCD_F_clearAllAnimationMemory(void)
109*5fd0122aSMatthias Ringwald {
110*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->ANMCTL, LCD_F_ANMCTL_ANMCLR_OFS) = 1;
111*5fd0122aSMatthias Ringwald }
112*5fd0122aSMatthias Ringwald
113*5fd0122aSMatthias Ringwald /* Pin Configuration Functions */
LCD_F_setPinAsLCDFunction(uint_fast8_t pin)114*5fd0122aSMatthias Ringwald void LCD_F_setPinAsLCDFunction(uint_fast8_t pin)
115*5fd0122aSMatthias Ringwald {
116*5fd0122aSMatthias Ringwald uint32_t val = (pin & 0x1F);
117*5fd0122aSMatthias Ringwald
118*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
119*5fd0122aSMatthias Ringwald
120*5fd0122aSMatthias Ringwald if((pin >> 5) == 0)
121*5fd0122aSMatthias Ringwald {
122*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->PCTL0, val) = 1;
123*5fd0122aSMatthias Ringwald }
124*5fd0122aSMatthias Ringwald else
125*5fd0122aSMatthias Ringwald {
126*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->PCTL1, val) = 1;
127*5fd0122aSMatthias Ringwald }
128*5fd0122aSMatthias Ringwald }
129*5fd0122aSMatthias Ringwald
LCD_F_setPinAsPortFunction(uint_fast8_t pin)130*5fd0122aSMatthias Ringwald void LCD_F_setPinAsPortFunction(uint_fast8_t pin)
131*5fd0122aSMatthias Ringwald {
132*5fd0122aSMatthias Ringwald uint32_t val = (pin & 0x1F);
133*5fd0122aSMatthias Ringwald
134*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
135*5fd0122aSMatthias Ringwald
136*5fd0122aSMatthias Ringwald if((pin >> 5) == 0)
137*5fd0122aSMatthias Ringwald {
138*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->PCTL0, val) = 0;
139*5fd0122aSMatthias Ringwald }
140*5fd0122aSMatthias Ringwald else
141*5fd0122aSMatthias Ringwald {
142*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->PCTL1, val) = 0;
143*5fd0122aSMatthias Ringwald }
144*5fd0122aSMatthias Ringwald }
145*5fd0122aSMatthias Ringwald
LCD_F_setPinsAsLCDFunction(uint_fast8_t startPin,uint8_t endPin)146*5fd0122aSMatthias Ringwald void LCD_F_setPinsAsLCDFunction(uint_fast8_t startPin, uint8_t endPin)
147*5fd0122aSMatthias Ringwald {
148*5fd0122aSMatthias Ringwald uint32_t startIdx = startPin >> 5;
149*5fd0122aSMatthias Ringwald uint32_t endIdx = endPin >> 5;
150*5fd0122aSMatthias Ringwald uint32_t startPos = startPin & 0x1F;
151*5fd0122aSMatthias Ringwald uint32_t endPos = endPin & 0x1F;
152*5fd0122aSMatthias Ringwald
153*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
154*5fd0122aSMatthias Ringwald
155*5fd0122aSMatthias Ringwald if (startIdx == endIdx)
156*5fd0122aSMatthias Ringwald {
157*5fd0122aSMatthias Ringwald if (startIdx == 0)
158*5fd0122aSMatthias Ringwald {
159*5fd0122aSMatthias Ringwald LCD_F->PCTL0 |= (0xFFFFFFFF >> (31 - endPos))
160*5fd0122aSMatthias Ringwald & (0xFFFFFFFF << startPos);
161*5fd0122aSMatthias Ringwald } else
162*5fd0122aSMatthias Ringwald {
163*5fd0122aSMatthias Ringwald LCD_F->PCTL1 |= (0xFFFFFFFF >> (31 - endPos))
164*5fd0122aSMatthias Ringwald & (0xFFFFFFFF << startPos);
165*5fd0122aSMatthias Ringwald }
166*5fd0122aSMatthias Ringwald } else
167*5fd0122aSMatthias Ringwald {
168*5fd0122aSMatthias Ringwald LCD_F->PCTL0 |= (0xFFFFFFFF << startPos);
169*5fd0122aSMatthias Ringwald LCD_F->PCTL1 |= (0xFFFFFFFF >> (31 - endPos));
170*5fd0122aSMatthias Ringwald }
171*5fd0122aSMatthias Ringwald }
172*5fd0122aSMatthias Ringwald
LCD_F_setPinAsCOM(uint8_t pin,uint_fast8_t com)173*5fd0122aSMatthias Ringwald void LCD_F_setPinAsCOM(uint8_t pin, uint_fast8_t com)
174*5fd0122aSMatthias Ringwald {
175*5fd0122aSMatthias Ringwald uint32_t val = (pin & 0x1F);
176*5fd0122aSMatthias Ringwald
177*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
178*5fd0122aSMatthias Ringwald
179*5fd0122aSMatthias Ringwald if((pin >> 5) == 0)
180*5fd0122aSMatthias Ringwald {
181*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CSSEL0, val) = 1;
182*5fd0122aSMatthias Ringwald }
183*5fd0122aSMatthias Ringwald else
184*5fd0122aSMatthias Ringwald {
185*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CSSEL1, val) = 1;
186*5fd0122aSMatthias Ringwald }
187*5fd0122aSMatthias Ringwald
188*5fd0122aSMatthias Ringwald // Setting the relevant COM pin
189*5fd0122aSMatthias Ringwald HWREG8(LCD_F_BASE + OFS_LCDM0W + pin) |= com;
190*5fd0122aSMatthias Ringwald HWREG8(LCD_F_BASE + OFS_LCDBM0W + pin) |= com;
191*5fd0122aSMatthias Ringwald
192*5fd0122aSMatthias Ringwald }
193*5fd0122aSMatthias Ringwald
LCD_F_setPinAsSEG(uint_fast8_t pin)194*5fd0122aSMatthias Ringwald void LCD_F_setPinAsSEG(uint_fast8_t pin)
195*5fd0122aSMatthias Ringwald {
196*5fd0122aSMatthias Ringwald uint32_t val = (pin & 0x1F);
197*5fd0122aSMatthias Ringwald
198*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
199*5fd0122aSMatthias Ringwald
200*5fd0122aSMatthias Ringwald if((pin >> 5) == 0)
201*5fd0122aSMatthias Ringwald {
202*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CSSEL0, val) = 0;
203*5fd0122aSMatthias Ringwald }
204*5fd0122aSMatthias Ringwald else
205*5fd0122aSMatthias Ringwald {
206*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CSSEL1, val) = 0;
207*5fd0122aSMatthias Ringwald }
208*5fd0122aSMatthias Ringwald }
209*5fd0122aSMatthias Ringwald
LCD_F_selectBias(uint_fast16_t bias)210*5fd0122aSMatthias Ringwald void LCD_F_selectBias(uint_fast16_t bias)
211*5fd0122aSMatthias Ringwald {
212*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
213*5fd0122aSMatthias Ringwald LCD_F->VCTL = (LCD_F->VCTL & ~LCD_F_VCTL_LCD2B) | bias;
214*5fd0122aSMatthias Ringwald }
215*5fd0122aSMatthias Ringwald
LCD_F_setVLCDSource(uint_fast16_t v2v3v4Source,uint_fast16_t v5Source)216*5fd0122aSMatthias Ringwald void LCD_F_setVLCDSource(uint_fast16_t v2v3v4Source, uint_fast16_t v5Source)
217*5fd0122aSMatthias Ringwald {
218*5fd0122aSMatthias Ringwald BITBAND_PERI(LCD_F->CTL, LCD_F_CTL_ON_OFS) = 0;
219*5fd0122aSMatthias Ringwald LCD_F->VCTL = (LCD_F->VCTL
220*5fd0122aSMatthias Ringwald & ~(LCD_F_VCTL_REXT | LCD_F_VCTL_EXTBIAS
221*5fd0122aSMatthias Ringwald | LCD_F_VCTL_R03EXT)) | v2v3v4Source | v5Source;
222*5fd0122aSMatthias Ringwald }
223*5fd0122aSMatthias Ringwald
224*5fd0122aSMatthias Ringwald /* Interrupt Management */
LCD_F_clearInterrupt(uint32_t mask)225*5fd0122aSMatthias Ringwald void LCD_F_clearInterrupt(uint32_t mask)
226*5fd0122aSMatthias Ringwald {
227*5fd0122aSMatthias Ringwald LCD_F->CLRIFG |= mask;
228*5fd0122aSMatthias Ringwald }
229*5fd0122aSMatthias Ringwald
LCD_F_getInterruptStatus(void)230*5fd0122aSMatthias Ringwald uint32_t LCD_F_getInterruptStatus(void)
231*5fd0122aSMatthias Ringwald {
232*5fd0122aSMatthias Ringwald return LCD_F->IFG;
233*5fd0122aSMatthias Ringwald }
234*5fd0122aSMatthias Ringwald
LCD_F_getEnabledInterruptStatus(void)235*5fd0122aSMatthias Ringwald uint32_t LCD_F_getEnabledInterruptStatus(void)
236*5fd0122aSMatthias Ringwald {
237*5fd0122aSMatthias Ringwald uint32_t tempIE = LCD_F->IE;
238*5fd0122aSMatthias Ringwald return (LCD_F->IFG & tempIE);
239*5fd0122aSMatthias Ringwald }
240*5fd0122aSMatthias Ringwald
LCD_F_enableInterrupt(uint32_t mask)241*5fd0122aSMatthias Ringwald void LCD_F_enableInterrupt(uint32_t mask)
242*5fd0122aSMatthias Ringwald {
243*5fd0122aSMatthias Ringwald LCD_F->IE |= mask;
244*5fd0122aSMatthias Ringwald }
245*5fd0122aSMatthias Ringwald
LCD_F_disableInterrupt(uint32_t mask)246*5fd0122aSMatthias Ringwald void LCD_F_disableInterrupt(uint32_t mask)
247*5fd0122aSMatthias Ringwald {
248*5fd0122aSMatthias Ringwald LCD_F->IE &= ~mask;
249*5fd0122aSMatthias Ringwald }
250*5fd0122aSMatthias Ringwald
LCD_F_registerInterrupt(void (* intHandler)(void))251*5fd0122aSMatthias Ringwald void LCD_F_registerInterrupt(void (*intHandler)(void))
252*5fd0122aSMatthias Ringwald {
253*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_LCD_F, intHandler);
254*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_LCD_F);
255*5fd0122aSMatthias Ringwald }
256*5fd0122aSMatthias Ringwald
LCD_F_unregisterInterrupt(void)257*5fd0122aSMatthias Ringwald void LCD_F_unregisterInterrupt(void)
258*5fd0122aSMatthias Ringwald {
259*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_LCD_F);
260*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_LCD_F);
261*5fd0122aSMatthias Ringwald }
262*5fd0122aSMatthias Ringwald
263*5fd0122aSMatthias Ringwald #endif /* __MCU_HAS_LCD_F__ */
264