mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_lcd.c@144:ef7eb2e8f9f7
Child:
150:02e0a0aed4ec
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 2 * @file em_lcd.c
<> 144:ef7eb2e8f9f7 3 * @brief Liquid Crystal Display (LCD) Peripheral API
<> 144:ef7eb2e8f9f7 4 * @version 4.2.1
<> 144:ef7eb2e8f9f7 5 *******************************************************************************
<> 144:ef7eb2e8f9f7 6 * @section License
<> 144:ef7eb2e8f9f7 7 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
<> 144:ef7eb2e8f9f7 8 *******************************************************************************
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Permission is granted to anyone to use this software for any purpose,
<> 144:ef7eb2e8f9f7 11 * including commercial applications, and to alter it and redistribute it
<> 144:ef7eb2e8f9f7 12 * freely, subject to the following restrictions:
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * 1. The origin of this software must not be misrepresented; you must not
<> 144:ef7eb2e8f9f7 15 * claim that you wrote the original software.
<> 144:ef7eb2e8f9f7 16 * 2. Altered source versions must be plainly marked as such, and must not be
<> 144:ef7eb2e8f9f7 17 * misrepresented as being the original software.
<> 144:ef7eb2e8f9f7 18 * 3. This notice may not be removed or altered from any source distribution.
<> 144:ef7eb2e8f9f7 19 *
<> 144:ef7eb2e8f9f7 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
<> 144:ef7eb2e8f9f7 21 * obligation to support this Software. Silicon Labs is providing the
<> 144:ef7eb2e8f9f7 22 * Software "AS IS", with no express or implied warranties of any kind,
<> 144:ef7eb2e8f9f7 23 * including, but not limited to, any implied warranties of merchantability
<> 144:ef7eb2e8f9f7 24 * or fitness for any particular purpose or warranties against infringement
<> 144:ef7eb2e8f9f7 25 * of any proprietary rights of a third party.
<> 144:ef7eb2e8f9f7 26 *
<> 144:ef7eb2e8f9f7 27 * Silicon Labs will not be liable for any consequential, incidental, or
<> 144:ef7eb2e8f9f7 28 * special damages, or any other relief, or for any claim by any third party,
<> 144:ef7eb2e8f9f7 29 * arising from your use of this Software.
<> 144:ef7eb2e8f9f7 30 *
<> 144:ef7eb2e8f9f7 31 ******************************************************************************/
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 #include "em_lcd.h"
<> 144:ef7eb2e8f9f7 34 #if defined(LCD_COUNT) && (LCD_COUNT > 0)
<> 144:ef7eb2e8f9f7 35 #include "em_assert.h"
<> 144:ef7eb2e8f9f7 36 #include "em_bus.h"
<> 144:ef7eb2e8f9f7 37
<> 144:ef7eb2e8f9f7 38 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 39 * @addtogroup EM_Library
<> 144:ef7eb2e8f9f7 40 * @{
<> 144:ef7eb2e8f9f7 41 ******************************************************************************/
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 44 * @addtogroup LCD
<> 144:ef7eb2e8f9f7 45 * @brief Liquid Crystal Display (LCD) Peripheral API
<> 144:ef7eb2e8f9f7 46 * @{
<> 144:ef7eb2e8f9f7 47 ******************************************************************************/
<> 144:ef7eb2e8f9f7 48
<> 144:ef7eb2e8f9f7 49 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 50 * @brief
<> 144:ef7eb2e8f9f7 51 * Initalize Liquid Crystal Display (LCD) controller
<> 144:ef7eb2e8f9f7 52 *
<> 144:ef7eb2e8f9f7 53 * @details
<> 144:ef7eb2e8f9f7 54 * This function call will only configure the LCD controller. You must enable
<> 144:ef7eb2e8f9f7 55 * it afterwards, potentially configuring Frame Control and interrupts first
<> 144:ef7eb2e8f9f7 56 * according to requirements.
<> 144:ef7eb2e8f9f7 57 *
<> 144:ef7eb2e8f9f7 58 * @param[in] lcdInit
<> 144:ef7eb2e8f9f7 59 * Pointer to initialization structure which configures LCD controller.
<> 144:ef7eb2e8f9f7 60 *
<> 144:ef7eb2e8f9f7 61 ******************************************************************************/
<> 144:ef7eb2e8f9f7 62 void LCD_Init(const LCD_Init_TypeDef *lcdInit)
<> 144:ef7eb2e8f9f7 63 {
<> 144:ef7eb2e8f9f7 64 uint32_t dispCtrl = LCD->DISPCTRL;
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 EFM_ASSERT(lcdInit != (void *) 0);
<> 144:ef7eb2e8f9f7 67
<> 144:ef7eb2e8f9f7 68 /* Disable controller before reconfiguration */
<> 144:ef7eb2e8f9f7 69 LCD_Enable(false);
<> 144:ef7eb2e8f9f7 70
<> 144:ef7eb2e8f9f7 71 /* Make sure we don't touch other bit fields (i.e. voltage boost) */
<> 144:ef7eb2e8f9f7 72 dispCtrl &= ~(0
<> 144:ef7eb2e8f9f7 73 #if defined(LCD_DISPCTRL_MUXE)
<> 144:ef7eb2e8f9f7 74 | _LCD_DISPCTRL_MUXE_MASK
<> 144:ef7eb2e8f9f7 75 #endif
<> 144:ef7eb2e8f9f7 76 | _LCD_DISPCTRL_MUX_MASK
<> 144:ef7eb2e8f9f7 77 | _LCD_DISPCTRL_BIAS_MASK
<> 144:ef7eb2e8f9f7 78 | _LCD_DISPCTRL_WAVE_MASK
<> 144:ef7eb2e8f9f7 79 | _LCD_DISPCTRL_VLCDSEL_MASK
<> 144:ef7eb2e8f9f7 80 | _LCD_DISPCTRL_CONCONF_MASK);
<> 144:ef7eb2e8f9f7 81
<> 144:ef7eb2e8f9f7 82 /* Configure controller according to initialization structure */
<> 144:ef7eb2e8f9f7 83 dispCtrl |= lcdInit->mux; /* also configures MUXE */
<> 144:ef7eb2e8f9f7 84 dispCtrl |= lcdInit->bias;
<> 144:ef7eb2e8f9f7 85 dispCtrl |= lcdInit->wave;
<> 144:ef7eb2e8f9f7 86 dispCtrl |= lcdInit->vlcd;
<> 144:ef7eb2e8f9f7 87 dispCtrl |= lcdInit->contrast;
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 /* Update display controller */
<> 144:ef7eb2e8f9f7 90 LCD->DISPCTRL = dispCtrl;
<> 144:ef7eb2e8f9f7 91
<> 144:ef7eb2e8f9f7 92 /* Enable controller if wanted */
<> 144:ef7eb2e8f9f7 93 if (lcdInit->enable)
<> 144:ef7eb2e8f9f7 94 {
<> 144:ef7eb2e8f9f7 95 LCD_Enable(true);
<> 144:ef7eb2e8f9f7 96 }
<> 144:ef7eb2e8f9f7 97 }
<> 144:ef7eb2e8f9f7 98
<> 144:ef7eb2e8f9f7 99
<> 144:ef7eb2e8f9f7 100 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 101 * @brief
<> 144:ef7eb2e8f9f7 102 * Select source for VLCD
<> 144:ef7eb2e8f9f7 103 *
<> 144:ef7eb2e8f9f7 104 * @param[in] vlcd
<> 144:ef7eb2e8f9f7 105 * Select source for VLD voltage
<> 144:ef7eb2e8f9f7 106 ******************************************************************************/
<> 144:ef7eb2e8f9f7 107 void LCD_VLCDSelect(LCD_VLCDSel_TypeDef vlcd)
<> 144:ef7eb2e8f9f7 108 {
<> 144:ef7eb2e8f9f7 109 uint32_t dispctrl = LCD->DISPCTRL;
<> 144:ef7eb2e8f9f7 110
<> 144:ef7eb2e8f9f7 111 /* Select VEXT or VDD */
<> 144:ef7eb2e8f9f7 112 dispctrl &= ~_LCD_DISPCTRL_VLCDSEL_MASK;
<> 144:ef7eb2e8f9f7 113 switch (vlcd)
<> 144:ef7eb2e8f9f7 114 {
<> 144:ef7eb2e8f9f7 115 case lcdVLCDSelVExtBoost:
<> 144:ef7eb2e8f9f7 116 dispctrl |= LCD_DISPCTRL_VLCDSEL_VEXTBOOST;
<> 144:ef7eb2e8f9f7 117 break;
<> 144:ef7eb2e8f9f7 118 case lcdVLCDSelVDD:
<> 144:ef7eb2e8f9f7 119 dispctrl |= LCD_DISPCTRL_VLCDSEL_VDD;
<> 144:ef7eb2e8f9f7 120 break;
<> 144:ef7eb2e8f9f7 121 default:
<> 144:ef7eb2e8f9f7 122 break;
<> 144:ef7eb2e8f9f7 123 }
<> 144:ef7eb2e8f9f7 124
<> 144:ef7eb2e8f9f7 125 LCD->DISPCTRL = dispctrl;
<> 144:ef7eb2e8f9f7 126 }
<> 144:ef7eb2e8f9f7 127
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 130 * @brief
<> 144:ef7eb2e8f9f7 131 * Configure Update Control
<> 144:ef7eb2e8f9f7 132 *
<> 144:ef7eb2e8f9f7 133 * @param[in] ud
<> 144:ef7eb2e8f9f7 134 * Configures LCD update method
<> 144:ef7eb2e8f9f7 135 ******************************************************************************/
<> 144:ef7eb2e8f9f7 136 void LCD_UpdateCtrl(LCD_UpdateCtrl_TypeDef ud)
<> 144:ef7eb2e8f9f7 137 {
<> 144:ef7eb2e8f9f7 138 LCD->CTRL = (LCD->CTRL & ~_LCD_CTRL_UDCTRL_MASK) | ud;
<> 144:ef7eb2e8f9f7 139 }
<> 144:ef7eb2e8f9f7 140
<> 144:ef7eb2e8f9f7 141
<> 144:ef7eb2e8f9f7 142 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 143 * @brief
<> 144:ef7eb2e8f9f7 144 * Initialize LCD Frame Counter
<> 144:ef7eb2e8f9f7 145 *
<> 144:ef7eb2e8f9f7 146 * @param[in] fcInit
<> 144:ef7eb2e8f9f7 147 * Pointer to Frame Counter initialization structure
<> 144:ef7eb2e8f9f7 148 ******************************************************************************/
<> 144:ef7eb2e8f9f7 149 void LCD_FrameCountInit(const LCD_FrameCountInit_TypeDef *fcInit)
<> 144:ef7eb2e8f9f7 150 {
<> 144:ef7eb2e8f9f7 151 uint32_t bactrl = LCD->BACTRL;
<> 144:ef7eb2e8f9f7 152
<> 144:ef7eb2e8f9f7 153 EFM_ASSERT(fcInit != (void *) 0);
<> 144:ef7eb2e8f9f7 154
<> 144:ef7eb2e8f9f7 155 /* Verify FC Top Counter to be within limits */
<> 144:ef7eb2e8f9f7 156 EFM_ASSERT(fcInit->top < 64);
<> 144:ef7eb2e8f9f7 157
<> 144:ef7eb2e8f9f7 158 /* Reconfigure frame count configuration */
<> 144:ef7eb2e8f9f7 159 bactrl &= ~(_LCD_BACTRL_FCTOP_MASK
<> 144:ef7eb2e8f9f7 160 | _LCD_BACTRL_FCPRESC_MASK);
<> 144:ef7eb2e8f9f7 161 bactrl |= (fcInit->top << _LCD_BACTRL_FCTOP_SHIFT);
<> 144:ef7eb2e8f9f7 162 bactrl |= fcInit->prescale;
<> 144:ef7eb2e8f9f7 163
<> 144:ef7eb2e8f9f7 164 /* Set Blink and Animation Control Register */
<> 144:ef7eb2e8f9f7 165 LCD->BACTRL = bactrl;
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 LCD_FrameCountEnable(fcInit->enable);
<> 144:ef7eb2e8f9f7 168 }
<> 144:ef7eb2e8f9f7 169
<> 144:ef7eb2e8f9f7 170
<> 144:ef7eb2e8f9f7 171 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 172 * @brief
<> 144:ef7eb2e8f9f7 173 * Configures LCD controller Animation feature
<> 144:ef7eb2e8f9f7 174 *
<> 144:ef7eb2e8f9f7 175 * @param[in] animInit
<> 144:ef7eb2e8f9f7 176 * Pointer to LCD Animation initialization structure
<> 144:ef7eb2e8f9f7 177 ******************************************************************************/
<> 144:ef7eb2e8f9f7 178 void LCD_AnimInit(const LCD_AnimInit_TypeDef *animInit)
<> 144:ef7eb2e8f9f7 179 {
<> 144:ef7eb2e8f9f7 180 uint32_t bactrl = LCD->BACTRL;
<> 144:ef7eb2e8f9f7 181
<> 144:ef7eb2e8f9f7 182 EFM_ASSERT(animInit != (void *) 0);
<> 144:ef7eb2e8f9f7 183
<> 144:ef7eb2e8f9f7 184 /* Set Animation Register Values */
<> 144:ef7eb2e8f9f7 185 LCD->AREGA = animInit->AReg;
<> 144:ef7eb2e8f9f7 186 LCD->AREGB = animInit->BReg;
<> 144:ef7eb2e8f9f7 187
<> 144:ef7eb2e8f9f7 188 /* Configure Animation Shift and Logic */
<> 144:ef7eb2e8f9f7 189 bactrl &= ~(_LCD_BACTRL_AREGASC_MASK
<> 144:ef7eb2e8f9f7 190 | _LCD_BACTRL_AREGBSC_MASK
<> 144:ef7eb2e8f9f7 191 | _LCD_BACTRL_ALOGSEL_MASK);
<> 144:ef7eb2e8f9f7 192
<> 144:ef7eb2e8f9f7 193 bactrl |= (animInit->AShift << _LCD_BACTRL_AREGASC_SHIFT);
<> 144:ef7eb2e8f9f7 194 bactrl |= (animInit->BShift << _LCD_BACTRL_AREGBSC_SHIFT);
<> 144:ef7eb2e8f9f7 195 bactrl |= animInit->animLogic;
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 #if defined(LCD_BACTRL_ALOC)
<> 144:ef7eb2e8f9f7 198 bactrl &= ~(_LCD_BACTRL_ALOC_MASK);
<> 144:ef7eb2e8f9f7 199
<> 144:ef7eb2e8f9f7 200 if(animInit->startSeg == 0)
<> 144:ef7eb2e8f9f7 201 {
<> 144:ef7eb2e8f9f7 202 bactrl |= LCD_BACTRL_ALOC_SEG0TO7;
<> 144:ef7eb2e8f9f7 203 }
<> 144:ef7eb2e8f9f7 204 else if(animInit->startSeg == 8)
<> 144:ef7eb2e8f9f7 205 {
<> 144:ef7eb2e8f9f7 206 bactrl |= LCD_BACTRL_ALOC_SEG8TO15;
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208 #endif
<> 144:ef7eb2e8f9f7 209
<> 144:ef7eb2e8f9f7 210 /* Reconfigure */
<> 144:ef7eb2e8f9f7 211 LCD->BACTRL = bactrl;
<> 144:ef7eb2e8f9f7 212
<> 144:ef7eb2e8f9f7 213 /* Enable */
<> 144:ef7eb2e8f9f7 214 LCD_AnimEnable(animInit->enable);
<> 144:ef7eb2e8f9f7 215 }
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 219 * @brief
<> 144:ef7eb2e8f9f7 220 * Enables update of this range of LCD segment lines
<> 144:ef7eb2e8f9f7 221 *
<> 144:ef7eb2e8f9f7 222 * @param[in] segmentRange
<> 144:ef7eb2e8f9f7 223 * Range of 4 LCD segments lines to enable or disable, for all enabled COM
<> 144:ef7eb2e8f9f7 224 * lines
<> 144:ef7eb2e8f9f7 225 *
<> 144:ef7eb2e8f9f7 226 * @param[in] enable
<> 144:ef7eb2e8f9f7 227 * Bool true to enable segment updates, false to disable updates
<> 144:ef7eb2e8f9f7 228 ******************************************************************************/
<> 144:ef7eb2e8f9f7 229 void LCD_SegmentRangeEnable(LCD_SegmentRange_TypeDef segmentRange, bool enable)
<> 144:ef7eb2e8f9f7 230 {
<> 144:ef7eb2e8f9f7 231 if (enable)
<> 144:ef7eb2e8f9f7 232 {
<> 144:ef7eb2e8f9f7 233 LCD->SEGEN |= segmentRange;
<> 144:ef7eb2e8f9f7 234 }
<> 144:ef7eb2e8f9f7 235 else
<> 144:ef7eb2e8f9f7 236 {
<> 144:ef7eb2e8f9f7 237 LCD->SEGEN &= ~((uint32_t)segmentRange);
<> 144:ef7eb2e8f9f7 238 }
<> 144:ef7eb2e8f9f7 239 }
<> 144:ef7eb2e8f9f7 240
<> 144:ef7eb2e8f9f7 241
<> 144:ef7eb2e8f9f7 242 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 243 * @brief
<> 144:ef7eb2e8f9f7 244 * Turn on or clear a segment
<> 144:ef7eb2e8f9f7 245 *
<> 144:ef7eb2e8f9f7 246 * @note
<> 144:ef7eb2e8f9f7 247 * On Gecko Family, max configuration is (COM-lines x Segment-Lines) 4x40
<> 144:ef7eb2e8f9f7 248 * On Tiny Family, max configuration is 8x20 or 4x24
<> 144:ef7eb2e8f9f7 249 * On Giant Family, max configuration is 8x36 or 4x40
<> 144:ef7eb2e8f9f7 250 *
<> 144:ef7eb2e8f9f7 251 * @param[in] com
<> 144:ef7eb2e8f9f7 252 * COM line to change
<> 144:ef7eb2e8f9f7 253 *
<> 144:ef7eb2e8f9f7 254 * @param[in] bit
<> 144:ef7eb2e8f9f7 255 * Bit index of which field to change
<> 144:ef7eb2e8f9f7 256 *
<> 144:ef7eb2e8f9f7 257 * @param[in] enable
<> 144:ef7eb2e8f9f7 258 * When true will set segment, when false will clear segment
<> 144:ef7eb2e8f9f7 259 ******************************************************************************/
<> 144:ef7eb2e8f9f7 260 void LCD_SegmentSet(int com, int bit, bool enable)
<> 144:ef7eb2e8f9f7 261 {
<> 144:ef7eb2e8f9f7 262 #if defined(_LCD_SEGD7L_MASK)
<> 144:ef7eb2e8f9f7 263 /* Tiny and Giant Family supports up to 8 COM lines */
<> 144:ef7eb2e8f9f7 264 EFM_ASSERT(com < 8);
<> 144:ef7eb2e8f9f7 265 #else
<> 144:ef7eb2e8f9f7 266 /* Gecko Family supports up to 4 COM lines */
<> 144:ef7eb2e8f9f7 267 EFM_ASSERT(com < 4);
<> 144:ef7eb2e8f9f7 268 #endif
<> 144:ef7eb2e8f9f7 269
<> 144:ef7eb2e8f9f7 270 #if defined(_LCD_SEGD0H_MASK)
<> 144:ef7eb2e8f9f7 271 EFM_ASSERT(bit < 40);
<> 144:ef7eb2e8f9f7 272 #else
<> 144:ef7eb2e8f9f7 273 /* Tiny Gecko Family supports only "low" segment registers */
<> 144:ef7eb2e8f9f7 274 EFM_ASSERT(bit < 32);
<> 144:ef7eb2e8f9f7 275 #endif
<> 144:ef7eb2e8f9f7 276
<> 144:ef7eb2e8f9f7 277 /* Use bitband access for atomic bit set/clear of segment */
<> 144:ef7eb2e8f9f7 278 switch (com)
<> 144:ef7eb2e8f9f7 279 {
<> 144:ef7eb2e8f9f7 280 case 0:
<> 144:ef7eb2e8f9f7 281 if (bit < 32)
<> 144:ef7eb2e8f9f7 282 {
<> 144:ef7eb2e8f9f7 283 BUS_RegBitWrite(&(LCD->SEGD0L), bit, enable);
<> 144:ef7eb2e8f9f7 284 }
<> 144:ef7eb2e8f9f7 285 #if defined(_LCD_SEGD0H_MASK)
<> 144:ef7eb2e8f9f7 286 else
<> 144:ef7eb2e8f9f7 287 {
<> 144:ef7eb2e8f9f7 288 bit -= 32;
<> 144:ef7eb2e8f9f7 289 BUS_RegBitWrite(&(LCD->SEGD0H), bit, enable);
<> 144:ef7eb2e8f9f7 290 }
<> 144:ef7eb2e8f9f7 291 #endif
<> 144:ef7eb2e8f9f7 292 break;
<> 144:ef7eb2e8f9f7 293 case 1:
<> 144:ef7eb2e8f9f7 294 if (bit < 32)
<> 144:ef7eb2e8f9f7 295 {
<> 144:ef7eb2e8f9f7 296 BUS_RegBitWrite(&(LCD->SEGD1L), bit, enable);
<> 144:ef7eb2e8f9f7 297 }
<> 144:ef7eb2e8f9f7 298 #if defined(_LCD_SEGD1H_MASK)
<> 144:ef7eb2e8f9f7 299 else
<> 144:ef7eb2e8f9f7 300 {
<> 144:ef7eb2e8f9f7 301 bit -= 32;
<> 144:ef7eb2e8f9f7 302 BUS_RegBitWrite(&(LCD->SEGD1H), bit, enable);
<> 144:ef7eb2e8f9f7 303 }
<> 144:ef7eb2e8f9f7 304 #endif
<> 144:ef7eb2e8f9f7 305 break;
<> 144:ef7eb2e8f9f7 306 case 2:
<> 144:ef7eb2e8f9f7 307 if (bit < 32)
<> 144:ef7eb2e8f9f7 308 {
<> 144:ef7eb2e8f9f7 309 BUS_RegBitWrite(&(LCD->SEGD2L), bit, enable);
<> 144:ef7eb2e8f9f7 310 }
<> 144:ef7eb2e8f9f7 311 #if defined(_LCD_SEGD2H_MASK)
<> 144:ef7eb2e8f9f7 312 else
<> 144:ef7eb2e8f9f7 313 {
<> 144:ef7eb2e8f9f7 314 bit -= 32;
<> 144:ef7eb2e8f9f7 315 BUS_RegBitWrite(&(LCD->SEGD2H), bit, enable);
<> 144:ef7eb2e8f9f7 316 }
<> 144:ef7eb2e8f9f7 317 #endif
<> 144:ef7eb2e8f9f7 318 break;
<> 144:ef7eb2e8f9f7 319 case 3:
<> 144:ef7eb2e8f9f7 320 if (bit < 32)
<> 144:ef7eb2e8f9f7 321 {
<> 144:ef7eb2e8f9f7 322 BUS_RegBitWrite(&(LCD->SEGD3L), bit, enable);
<> 144:ef7eb2e8f9f7 323 }
<> 144:ef7eb2e8f9f7 324 #if defined(_LCD_SEGD3H_MASK)
<> 144:ef7eb2e8f9f7 325 else
<> 144:ef7eb2e8f9f7 326 {
<> 144:ef7eb2e8f9f7 327 bit -= 32;
<> 144:ef7eb2e8f9f7 328 BUS_RegBitWrite(&(LCD->SEGD3H), bit, enable);
<> 144:ef7eb2e8f9f7 329 }
<> 144:ef7eb2e8f9f7 330 #endif
<> 144:ef7eb2e8f9f7 331 break;
<> 144:ef7eb2e8f9f7 332 #if defined(_LCD_SEGD4L_MASK)
<> 144:ef7eb2e8f9f7 333 case 4:
<> 144:ef7eb2e8f9f7 334 if (bit < 32)
<> 144:ef7eb2e8f9f7 335 {
<> 144:ef7eb2e8f9f7 336 BUS_RegBitWrite(&(LCD->SEGD4L), bit, enable);
<> 144:ef7eb2e8f9f7 337 }
<> 144:ef7eb2e8f9f7 338 #if defined(_LCD_SEGD4H_MASK)
<> 144:ef7eb2e8f9f7 339 else
<> 144:ef7eb2e8f9f7 340 {
<> 144:ef7eb2e8f9f7 341 bit -= 32;
<> 144:ef7eb2e8f9f7 342 BUS_RegBitWrite(&(LCD->SEGD4H), bit, enable);
<> 144:ef7eb2e8f9f7 343 }
<> 144:ef7eb2e8f9f7 344 #endif
<> 144:ef7eb2e8f9f7 345 break;
<> 144:ef7eb2e8f9f7 346 #endif
<> 144:ef7eb2e8f9f7 347 #if defined(_LCD_SEGD5L_MASK)
<> 144:ef7eb2e8f9f7 348 case 5:
<> 144:ef7eb2e8f9f7 349 if (bit < 32)
<> 144:ef7eb2e8f9f7 350 {
<> 144:ef7eb2e8f9f7 351 BUS_RegBitWrite(&(LCD->SEGD5L), bit, enable);
<> 144:ef7eb2e8f9f7 352 }
<> 144:ef7eb2e8f9f7 353 #if defined(_LCD_SEGD5H_MASK)
<> 144:ef7eb2e8f9f7 354 else
<> 144:ef7eb2e8f9f7 355 {
<> 144:ef7eb2e8f9f7 356 bit -= 32;
<> 144:ef7eb2e8f9f7 357 BUS_RegBitWrite(&(LCD->SEGD5H), bit, enable);
<> 144:ef7eb2e8f9f7 358 }
<> 144:ef7eb2e8f9f7 359 #endif
<> 144:ef7eb2e8f9f7 360 break;
<> 144:ef7eb2e8f9f7 361 #endif
<> 144:ef7eb2e8f9f7 362 case 6:
<> 144:ef7eb2e8f9f7 363 #if defined(_LCD_SEGD6L_MASK)
<> 144:ef7eb2e8f9f7 364 if (bit < 32)
<> 144:ef7eb2e8f9f7 365 {
<> 144:ef7eb2e8f9f7 366 BUS_RegBitWrite(&(LCD->SEGD6L), bit, enable);
<> 144:ef7eb2e8f9f7 367 }
<> 144:ef7eb2e8f9f7 368 #if defined(_LCD_SEGD6H_MASK)
<> 144:ef7eb2e8f9f7 369 else
<> 144:ef7eb2e8f9f7 370 {
<> 144:ef7eb2e8f9f7 371 bit -= 32;
<> 144:ef7eb2e8f9f7 372 BUS_RegBitWrite(&(LCD->SEGD6H), bit, enable);
<> 144:ef7eb2e8f9f7 373 }
<> 144:ef7eb2e8f9f7 374 #endif
<> 144:ef7eb2e8f9f7 375 break;
<> 144:ef7eb2e8f9f7 376 #endif
<> 144:ef7eb2e8f9f7 377 #if defined(_LCD_SEGD7L_MASK)
<> 144:ef7eb2e8f9f7 378 case 7:
<> 144:ef7eb2e8f9f7 379 if (bit < 32)
<> 144:ef7eb2e8f9f7 380 {
<> 144:ef7eb2e8f9f7 381 BUS_RegBitWrite(&(LCD->SEGD7L), bit, enable);
<> 144:ef7eb2e8f9f7 382 }
<> 144:ef7eb2e8f9f7 383 #if defined(_LCD_SEGD7H_MASK)
<> 144:ef7eb2e8f9f7 384 else
<> 144:ef7eb2e8f9f7 385 {
<> 144:ef7eb2e8f9f7 386 bit -= 32;
<> 144:ef7eb2e8f9f7 387 BUS_RegBitWrite(&(LCD->SEGD7H), bit, enable);
<> 144:ef7eb2e8f9f7 388 }
<> 144:ef7eb2e8f9f7 389 #endif
<> 144:ef7eb2e8f9f7 390 break;
<> 144:ef7eb2e8f9f7 391 #endif
<> 144:ef7eb2e8f9f7 392
<> 144:ef7eb2e8f9f7 393 default:
<> 144:ef7eb2e8f9f7 394 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 395 break;
<> 144:ef7eb2e8f9f7 396 }
<> 144:ef7eb2e8f9f7 397 }
<> 144:ef7eb2e8f9f7 398
<> 144:ef7eb2e8f9f7 399
<> 144:ef7eb2e8f9f7 400 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 401 * @brief
<> 144:ef7eb2e8f9f7 402 * Updates the 0-31 lowest segments on a given COM-line in one operation,
<> 144:ef7eb2e8f9f7 403 * according to bit mask
<> 144:ef7eb2e8f9f7 404 *
<> 144:ef7eb2e8f9f7 405 * @param[in] com
<> 144:ef7eb2e8f9f7 406 * Which COM line to update
<> 144:ef7eb2e8f9f7 407 *
<> 144:ef7eb2e8f9f7 408 * @param[in] mask
<> 144:ef7eb2e8f9f7 409 * Bit mask for segments 0-31
<> 144:ef7eb2e8f9f7 410 *
<> 144:ef7eb2e8f9f7 411 * @param[in] bits
<> 144:ef7eb2e8f9f7 412 * Bit pattern for segments 0-31
<> 144:ef7eb2e8f9f7 413 ******************************************************************************/
<> 144:ef7eb2e8f9f7 414 void LCD_SegmentSetLow(int com, uint32_t mask, uint32_t bits)
<> 144:ef7eb2e8f9f7 415 {
<> 144:ef7eb2e8f9f7 416 uint32_t segData;
<> 144:ef7eb2e8f9f7 417
<> 144:ef7eb2e8f9f7 418 /* Maximum number of com lines */
<> 144:ef7eb2e8f9f7 419 #if defined(_LCD_SEGD7L_MASK)
<> 144:ef7eb2e8f9f7 420 EFM_ASSERT(com < 8);
<> 144:ef7eb2e8f9f7 421 #else
<> 144:ef7eb2e8f9f7 422 /* Gecko Family supports up to 4 COM lines */
<> 144:ef7eb2e8f9f7 423 EFM_ASSERT(com < 4);
<> 144:ef7eb2e8f9f7 424 #endif
<> 144:ef7eb2e8f9f7 425
<> 144:ef7eb2e8f9f7 426 switch (com)
<> 144:ef7eb2e8f9f7 427 {
<> 144:ef7eb2e8f9f7 428 case 0:
<> 144:ef7eb2e8f9f7 429 segData = LCD->SEGD0L;
<> 144:ef7eb2e8f9f7 430 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 431 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 432 LCD->SEGD0L = segData;
<> 144:ef7eb2e8f9f7 433 break;
<> 144:ef7eb2e8f9f7 434 case 1:
<> 144:ef7eb2e8f9f7 435 segData = LCD->SEGD1L;
<> 144:ef7eb2e8f9f7 436 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 437 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 438 LCD->SEGD1L = segData;
<> 144:ef7eb2e8f9f7 439 break;
<> 144:ef7eb2e8f9f7 440 case 2:
<> 144:ef7eb2e8f9f7 441 segData = LCD->SEGD2L;
<> 144:ef7eb2e8f9f7 442 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 443 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 444 LCD->SEGD2L = segData;
<> 144:ef7eb2e8f9f7 445 break;
<> 144:ef7eb2e8f9f7 446 case 3:
<> 144:ef7eb2e8f9f7 447 segData = LCD->SEGD3L;
<> 144:ef7eb2e8f9f7 448 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 449 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 450 LCD->SEGD3L = segData;
<> 144:ef7eb2e8f9f7 451 break;
<> 144:ef7eb2e8f9f7 452 #if defined(_LCD_SEGD4L_MASK)
<> 144:ef7eb2e8f9f7 453 case 4:
<> 144:ef7eb2e8f9f7 454 segData = LCD->SEGD4L;
<> 144:ef7eb2e8f9f7 455 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 456 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 457 LCD->SEGD4L = segData;
<> 144:ef7eb2e8f9f7 458 break;
<> 144:ef7eb2e8f9f7 459 #endif
<> 144:ef7eb2e8f9f7 460 #if defined(_LCD_SEGD5L_MASK)
<> 144:ef7eb2e8f9f7 461 case 5:
<> 144:ef7eb2e8f9f7 462 segData = LCD->SEGD5L;
<> 144:ef7eb2e8f9f7 463 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 464 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 465 LCD->SEGD5L = segData;
<> 144:ef7eb2e8f9f7 466 break;
<> 144:ef7eb2e8f9f7 467 #endif
<> 144:ef7eb2e8f9f7 468 #if defined(_LCD_SEGD6L_MASK)
<> 144:ef7eb2e8f9f7 469 case 6:
<> 144:ef7eb2e8f9f7 470 segData = LCD->SEGD6L;
<> 144:ef7eb2e8f9f7 471 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 472 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 473 LCD->SEGD6L = segData;
<> 144:ef7eb2e8f9f7 474 break;
<> 144:ef7eb2e8f9f7 475 #endif
<> 144:ef7eb2e8f9f7 476 #if defined(_LCD_SEGD7L_MASK)
<> 144:ef7eb2e8f9f7 477 case 7:
<> 144:ef7eb2e8f9f7 478 segData = LCD->SEGD7L;
<> 144:ef7eb2e8f9f7 479 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 480 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 481 LCD->SEGD7L = segData;
<> 144:ef7eb2e8f9f7 482 break;
<> 144:ef7eb2e8f9f7 483 #endif
<> 144:ef7eb2e8f9f7 484 default:
<> 144:ef7eb2e8f9f7 485 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 486 break;
<> 144:ef7eb2e8f9f7 487 }
<> 144:ef7eb2e8f9f7 488 }
<> 144:ef7eb2e8f9f7 489
<> 144:ef7eb2e8f9f7 490
<> 144:ef7eb2e8f9f7 491 #if defined(_LCD_SEGD0H_MASK)
<> 144:ef7eb2e8f9f7 492 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 493 * @brief
<> 144:ef7eb2e8f9f7 494 * Updated the high (32-39) segments on a given COM-line in one operation
<> 144:ef7eb2e8f9f7 495 *
<> 144:ef7eb2e8f9f7 496 * @param[in] com
<> 144:ef7eb2e8f9f7 497 * Which COM line to update
<> 144:ef7eb2e8f9f7 498 *
<> 144:ef7eb2e8f9f7 499 * @param[in] mask
<> 144:ef7eb2e8f9f7 500 * Bit mask for segments 32-39
<> 144:ef7eb2e8f9f7 501 *
<> 144:ef7eb2e8f9f7 502 * @param[in] bits
<> 144:ef7eb2e8f9f7 503 * Bit pattern for segments 32-39
<> 144:ef7eb2e8f9f7 504 ******************************************************************************/
<> 144:ef7eb2e8f9f7 505 void LCD_SegmentSetHigh(int com, uint32_t mask, uint32_t bits)
<> 144:ef7eb2e8f9f7 506 {
<> 144:ef7eb2e8f9f7 507 uint32_t segData;
<> 144:ef7eb2e8f9f7 508
<> 144:ef7eb2e8f9f7 509 #if defined(_LCD_SEGD7H_MASK)
<> 144:ef7eb2e8f9f7 510 EFM_ASSERT(com < 8);
<> 144:ef7eb2e8f9f7 511 #else
<> 144:ef7eb2e8f9f7 512 EFM_ASSERT(com < 4);
<> 144:ef7eb2e8f9f7 513 #endif
<> 144:ef7eb2e8f9f7 514
<> 144:ef7eb2e8f9f7 515 /* Maximum number of com lines */
<> 144:ef7eb2e8f9f7 516 switch (com)
<> 144:ef7eb2e8f9f7 517 {
<> 144:ef7eb2e8f9f7 518 case 0:
<> 144:ef7eb2e8f9f7 519 segData = LCD->SEGD0H;
<> 144:ef7eb2e8f9f7 520 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 521 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 522 LCD->SEGD0H = segData;
<> 144:ef7eb2e8f9f7 523 break;
<> 144:ef7eb2e8f9f7 524 case 1:
<> 144:ef7eb2e8f9f7 525 segData = LCD->SEGD1H;
<> 144:ef7eb2e8f9f7 526 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 527 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 528 LCD->SEGD1H = segData;
<> 144:ef7eb2e8f9f7 529 break;
<> 144:ef7eb2e8f9f7 530 case 2:
<> 144:ef7eb2e8f9f7 531 segData = LCD->SEGD2H;
<> 144:ef7eb2e8f9f7 532 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 533 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 534 LCD->SEGD2H = segData;
<> 144:ef7eb2e8f9f7 535 break;
<> 144:ef7eb2e8f9f7 536 case 3:
<> 144:ef7eb2e8f9f7 537 segData = LCD->SEGD3H;
<> 144:ef7eb2e8f9f7 538 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 539 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 540 LCD->SEGD3H = segData;
<> 144:ef7eb2e8f9f7 541 break;
<> 144:ef7eb2e8f9f7 542 #if defined(_LCD_SEGD4H_MASK)
<> 144:ef7eb2e8f9f7 543 case 4:
<> 144:ef7eb2e8f9f7 544 segData = LCD->SEGD4H;
<> 144:ef7eb2e8f9f7 545 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 546 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 547 LCD->SEGD4H = segData;
<> 144:ef7eb2e8f9f7 548 break;
<> 144:ef7eb2e8f9f7 549 #endif
<> 144:ef7eb2e8f9f7 550 #if defined(_LCD_SEGD5H_MASK)
<> 144:ef7eb2e8f9f7 551 case 5:
<> 144:ef7eb2e8f9f7 552 segData = LCD->SEGD5H;
<> 144:ef7eb2e8f9f7 553 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 554 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 555 LCD->SEGD5H = segData;
<> 144:ef7eb2e8f9f7 556 break;
<> 144:ef7eb2e8f9f7 557 #endif
<> 144:ef7eb2e8f9f7 558 #if defined(_LCD_SEGD6H_MASK)
<> 144:ef7eb2e8f9f7 559 case 6:
<> 144:ef7eb2e8f9f7 560 segData = LCD->SEGD6H;
<> 144:ef7eb2e8f9f7 561 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 562 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 563 LCD->SEGD6H = segData;
<> 144:ef7eb2e8f9f7 564 break;
<> 144:ef7eb2e8f9f7 565 #endif
<> 144:ef7eb2e8f9f7 566 #if defined(_LCD_SEGD7H_MASK)
<> 144:ef7eb2e8f9f7 567 case 7:
<> 144:ef7eb2e8f9f7 568 segData = LCD->SEGD7H;
<> 144:ef7eb2e8f9f7 569 segData &= ~(mask);
<> 144:ef7eb2e8f9f7 570 segData |= (mask & bits);
<> 144:ef7eb2e8f9f7 571 LCD->SEGD7H = segData;
<> 144:ef7eb2e8f9f7 572 break;
<> 144:ef7eb2e8f9f7 573 #endif
<> 144:ef7eb2e8f9f7 574 default:
<> 144:ef7eb2e8f9f7 575 break;
<> 144:ef7eb2e8f9f7 576 }
<> 144:ef7eb2e8f9f7 577 }
<> 144:ef7eb2e8f9f7 578 #endif
<> 144:ef7eb2e8f9f7 579
<> 144:ef7eb2e8f9f7 580 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 581 * @brief
<> 144:ef7eb2e8f9f7 582 * Configure contrast level on LCD panel
<> 144:ef7eb2e8f9f7 583 *
<> 144:ef7eb2e8f9f7 584 * @param[in] level
<> 144:ef7eb2e8f9f7 585 * Contrast level in the range 0-31
<> 144:ef7eb2e8f9f7 586 ******************************************************************************/
<> 144:ef7eb2e8f9f7 587 void LCD_ContrastSet(int level)
<> 144:ef7eb2e8f9f7 588 {
<> 144:ef7eb2e8f9f7 589 EFM_ASSERT(level < 32);
<> 144:ef7eb2e8f9f7 590
<> 144:ef7eb2e8f9f7 591 LCD->DISPCTRL = (LCD->DISPCTRL & ~_LCD_DISPCTRL_CONLEV_MASK)
<> 144:ef7eb2e8f9f7 592 | (level << _LCD_DISPCTRL_CONLEV_SHIFT);
<> 144:ef7eb2e8f9f7 593 }
<> 144:ef7eb2e8f9f7 594
<> 144:ef7eb2e8f9f7 595
<> 144:ef7eb2e8f9f7 596 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 597 * @brief
<> 144:ef7eb2e8f9f7 598 * Configure voltage booster
<> 144:ef7eb2e8f9f7 599 *
<> 144:ef7eb2e8f9f7 600 * The resulting voltage level is described in each part number's data sheet
<> 144:ef7eb2e8f9f7 601 *
<> 144:ef7eb2e8f9f7 602 * @param[in] vboost
<> 144:ef7eb2e8f9f7 603 * Voltage boost level
<> 144:ef7eb2e8f9f7 604 ******************************************************************************/
<> 144:ef7eb2e8f9f7 605 void LCD_VBoostSet(LCD_VBoostLevel_TypeDef vboost)
<> 144:ef7eb2e8f9f7 606 {
<> 144:ef7eb2e8f9f7 607 /* Reconfigure Voltage Boost */
<> 144:ef7eb2e8f9f7 608 LCD->DISPCTRL = (LCD->DISPCTRL & ~_LCD_DISPCTRL_VBLEV_MASK) | vboost;
<> 144:ef7eb2e8f9f7 609 }
<> 144:ef7eb2e8f9f7 610
<> 144:ef7eb2e8f9f7 611
<> 144:ef7eb2e8f9f7 612 #if defined(LCD_CTRL_DSC)
<> 144:ef7eb2e8f9f7 613 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 614 * @brief
<> 144:ef7eb2e8f9f7 615 * Configure bias level for a specific segment line for Direct Segment Control
<> 144:ef7eb2e8f9f7 616 *
<> 144:ef7eb2e8f9f7 617 * @note
<> 144:ef7eb2e8f9f7 618 * When DSC is active, each configuration takes up 4 bits in the Segment
<> 144:ef7eb2e8f9f7 619 * Registers (SEGD0L/SEGD1H) which defines bias level.
<> 144:ef7eb2e8f9f7 620 * For optimal use of this feature, the entire SEGD-registers should be set
<> 144:ef7eb2e8f9f7 621 * at once in a optimized routine, so this function is mainly here to
<> 144:ef7eb2e8f9f7 622 * demonstrate how to correctly configure the bias levels, and should be used
<> 144:ef7eb2e8f9f7 623 * with care.
<> 144:ef7eb2e8f9f7 624 *
<> 144:ef7eb2e8f9f7 625 * @param[in] segmentLine
<> 144:ef7eb2e8f9f7 626 * Segment line number
<> 144:ef7eb2e8f9f7 627 *
<> 144:ef7eb2e8f9f7 628 * @param[in] biasLevel
<> 144:ef7eb2e8f9f7 629 * Bias configuration level, 0-4. This value must be within the constraint
<> 144:ef7eb2e8f9f7 630 * defined by the LCD_DISPCTRL bias setting, see Reference Manual/Datasheet
<> 144:ef7eb2e8f9f7 631 ******************************************************************************/
<> 144:ef7eb2e8f9f7 632 void LCD_BiasSegmentSet(int segmentLine, int biasLevel)
<> 144:ef7eb2e8f9f7 633 {
<> 144:ef7eb2e8f9f7 634 int biasRegister;
<> 144:ef7eb2e8f9f7 635 int bitShift;
<> 144:ef7eb2e8f9f7 636 volatile uint32_t *segmentRegister;
<> 144:ef7eb2e8f9f7 637
<> 144:ef7eb2e8f9f7 638 #if !defined(_LCD_SEGD0H_MASK)
<> 144:ef7eb2e8f9f7 639 EFM_ASSERT(segmentLine < 20);
<> 144:ef7eb2e8f9f7 640
<> 144:ef7eb2e8f9f7 641 /* Bias config for 8 segment lines per SEGDnL register */
<> 144:ef7eb2e8f9f7 642 biasRegister = segmentLine / 8;
<> 144:ef7eb2e8f9f7 643 bitShift = (segmentLine % 8) * 4;
<> 144:ef7eb2e8f9f7 644
<> 144:ef7eb2e8f9f7 645 switch (biasRegister)
<> 144:ef7eb2e8f9f7 646 {
<> 144:ef7eb2e8f9f7 647 case 0:
<> 144:ef7eb2e8f9f7 648 segmentRegister = &LCD->SEGD0L;
<> 144:ef7eb2e8f9f7 649 break;
<> 144:ef7eb2e8f9f7 650 case 1:
<> 144:ef7eb2e8f9f7 651 segmentRegister = &LCD->SEGD1L;
<> 144:ef7eb2e8f9f7 652 break;
<> 144:ef7eb2e8f9f7 653 case 2:
<> 144:ef7eb2e8f9f7 654 segmentRegister = &LCD->SEGD2L;
<> 144:ef7eb2e8f9f7 655 break;
<> 144:ef7eb2e8f9f7 656 case 3:
<> 144:ef7eb2e8f9f7 657 segmentRegister = &LCD->SEGD3L;
<> 144:ef7eb2e8f9f7 658 break;
<> 144:ef7eb2e8f9f7 659 default:
<> 144:ef7eb2e8f9f7 660 segmentRegister = (uint32_t *)0x00000000;
<> 144:ef7eb2e8f9f7 661 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 662 break;
<> 144:ef7eb2e8f9f7 663 }
<> 144:ef7eb2e8f9f7 664 #else
<> 144:ef7eb2e8f9f7 665 EFM_ASSERT(segmentLine < 40);
<> 144:ef7eb2e8f9f7 666
<> 144:ef7eb2e8f9f7 667 /* Bias config for 10 segment lines per SEGDn L+H registers */
<> 144:ef7eb2e8f9f7 668 biasRegister = segmentLine / 10;
<> 144:ef7eb2e8f9f7 669 bitShift = (segmentLine % 10) * 4;
<> 144:ef7eb2e8f9f7 670
<> 144:ef7eb2e8f9f7 671 switch (biasRegister)
<> 144:ef7eb2e8f9f7 672 {
<> 144:ef7eb2e8f9f7 673 case 0:
<> 144:ef7eb2e8f9f7 674 if (bitShift < 32)
<> 144:ef7eb2e8f9f7 675 {
<> 144:ef7eb2e8f9f7 676 segmentRegister = &LCD->SEGD0L;
<> 144:ef7eb2e8f9f7 677 }
<> 144:ef7eb2e8f9f7 678 else
<> 144:ef7eb2e8f9f7 679 {
<> 144:ef7eb2e8f9f7 680 segmentRegister = &LCD->SEGD0H;
<> 144:ef7eb2e8f9f7 681 bitShift -= 32;
<> 144:ef7eb2e8f9f7 682 }
<> 144:ef7eb2e8f9f7 683 break;
<> 144:ef7eb2e8f9f7 684 case 1:
<> 144:ef7eb2e8f9f7 685 if (bitShift < 32)
<> 144:ef7eb2e8f9f7 686 {
<> 144:ef7eb2e8f9f7 687 segmentRegister = &LCD->SEGD1L;
<> 144:ef7eb2e8f9f7 688 }
<> 144:ef7eb2e8f9f7 689 else
<> 144:ef7eb2e8f9f7 690 {
<> 144:ef7eb2e8f9f7 691 segmentRegister = &LCD->SEGD1H;
<> 144:ef7eb2e8f9f7 692 bitShift -= 32;
<> 144:ef7eb2e8f9f7 693 }
<> 144:ef7eb2e8f9f7 694 break;
<> 144:ef7eb2e8f9f7 695 case 2:
<> 144:ef7eb2e8f9f7 696 if (bitShift < 32)
<> 144:ef7eb2e8f9f7 697 {
<> 144:ef7eb2e8f9f7 698 segmentRegister = &LCD->SEGD2L;
<> 144:ef7eb2e8f9f7 699 }
<> 144:ef7eb2e8f9f7 700 else
<> 144:ef7eb2e8f9f7 701 {
<> 144:ef7eb2e8f9f7 702 segmentRegister = &LCD->SEGD1H;
<> 144:ef7eb2e8f9f7 703 bitShift -= 32;
<> 144:ef7eb2e8f9f7 704 }
<> 144:ef7eb2e8f9f7 705 break;
<> 144:ef7eb2e8f9f7 706 case 3:
<> 144:ef7eb2e8f9f7 707 if (bitShift < 32)
<> 144:ef7eb2e8f9f7 708 {
<> 144:ef7eb2e8f9f7 709 segmentRegister = &LCD->SEGD3L;
<> 144:ef7eb2e8f9f7 710 }
<> 144:ef7eb2e8f9f7 711 else
<> 144:ef7eb2e8f9f7 712 {
<> 144:ef7eb2e8f9f7 713 segmentRegister = &LCD->SEGD3H;
<> 144:ef7eb2e8f9f7 714 bitShift -= 32;
<> 144:ef7eb2e8f9f7 715 }
<> 144:ef7eb2e8f9f7 716 break;
<> 144:ef7eb2e8f9f7 717 default:
<> 144:ef7eb2e8f9f7 718 segmentRegister = (uint32_t *)0x00000000;
<> 144:ef7eb2e8f9f7 719 EFM_ASSERT(0);
<> 144:ef7eb2e8f9f7 720 break;
<> 144:ef7eb2e8f9f7 721 }
<> 144:ef7eb2e8f9f7 722 #endif
<> 144:ef7eb2e8f9f7 723
<> 144:ef7eb2e8f9f7 724 /* Configure new bias setting */
<> 144:ef7eb2e8f9f7 725 *segmentRegister = (*segmentRegister & ~(0xF << bitShift)) | (biasLevel << bitShift);
<> 144:ef7eb2e8f9f7 726 }
<> 144:ef7eb2e8f9f7 727 #endif
<> 144:ef7eb2e8f9f7 728
<> 144:ef7eb2e8f9f7 729
<> 144:ef7eb2e8f9f7 730 #if defined(LCD_CTRL_DSC)
<> 144:ef7eb2e8f9f7 731 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 732 * @brief
<> 144:ef7eb2e8f9f7 733 * Configure bias level for a specific segment line
<> 144:ef7eb2e8f9f7 734 *
<> 144:ef7eb2e8f9f7 735 * @note
<> 144:ef7eb2e8f9f7 736 * When DSC is active, each configuration takes up 4 bits in the Segment
<> 144:ef7eb2e8f9f7 737 * Registers (SEGD4L/SEGD4H) which defines bias level.
<> 144:ef7eb2e8f9f7 738 * For optimal use of this feature, the entire SEGD-registers should be set
<> 144:ef7eb2e8f9f7 739 * at once in a optimized routine, so this function is mainly here to
<> 144:ef7eb2e8f9f7 740 * demonstrate how to correctly configure the bias levels, and should be used
<> 144:ef7eb2e8f9f7 741 * with care.
<> 144:ef7eb2e8f9f7 742 *
<> 144:ef7eb2e8f9f7 743 * @param[in] comLine
<> 144:ef7eb2e8f9f7 744 * COM line number, 0-7
<> 144:ef7eb2e8f9f7 745 *
<> 144:ef7eb2e8f9f7 746 * @param[in] biasLevel
<> 144:ef7eb2e8f9f7 747 * Bias configuration level, 0-4. This value must be within the constraint
<> 144:ef7eb2e8f9f7 748 * defined by the LCD_DISPCTRL bias setting, see Reference Manual/Datasheet
<> 144:ef7eb2e8f9f7 749 ******************************************************************************/
<> 144:ef7eb2e8f9f7 750 void LCD_BiasComSet(int comLine, int biasLevel)
<> 144:ef7eb2e8f9f7 751 {
<> 144:ef7eb2e8f9f7 752 int bitShift;
<> 144:ef7eb2e8f9f7 753 EFM_ASSERT(comLine < 8);
<> 144:ef7eb2e8f9f7 754
<> 144:ef7eb2e8f9f7 755 bitShift = comLine * 4;
<> 144:ef7eb2e8f9f7 756 LCD->SEGD4L = (LCD->SEGD4L & ~(0xF << bitShift)) | (biasLevel << bitShift);
<> 144:ef7eb2e8f9f7 757 }
<> 144:ef7eb2e8f9f7 758 #endif
<> 144:ef7eb2e8f9f7 759
<> 144:ef7eb2e8f9f7 760 /** @} (end addtogroup LCD) */
<> 144:ef7eb2e8f9f7 761 /** @} (end addtogroup EM_Library) */
<> 144:ef7eb2e8f9f7 762
<> 144:ef7eb2e8f9f7 763 #endif /* defined(LCD_COUNT) && (LCD_COUNT > 0) */