xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/lcd_f.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
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