added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Fri Jan 15 07:45:16 2016 +0000
Revision:
50:a417edff4437
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision 6010f32619bfcbb01cc73747d4ff9040863482d9

Full URL: https://github.com/mbedmicro/mbed/commit/6010f32619bfcbb01cc73747d4ff9040863482d9/

Remove doubling of buffer size in realiseEndpoint()

Who changed what in which revision?

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