mbed library sources. Supersedes mbed-src.

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

Committer:
<>
Date:
Thu Mar 30 13:45:57 2017 +0100
Revision:
161:2cc1468da177
Parent:
150:02e0a0aed4ec
Child:
179:b0033dcd6934
This updates the lib to the mbed lib v139

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