source: rtems/c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup lpc24xx_lcd
5 *
6 * @brief LCD support.
7 */
8
9/*
10 * Copyright (c) 2010-2012 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#include <assert.h>
24
25#include <bsp/lpc24xx.h>
26#include <bsp/lcd.h>
27#include <bsp/lpc-lcd.h>
28#include <bsp/utility.h>
29#include <bsp/system-clocks.h>
30
31#ifdef ARM_MULTILIB_ARCH_V4
32  #define LCD_ENABLE BSP_BIT32(0)
33#endif
34
35rtems_status_code lpc24xx_lcd_set_mode(
36  lpc24xx_lcd_mode mode,
37  const lpc24xx_pin_range *pins
38)
39{
40  rtems_status_code sc = RTEMS_SUCCESSFUL;
41  bool enable = false;
42
43  switch (mode) {
44    case LCD_MODE_STN_4_BIT:
45    case LCD_MODE_STN_8_BIT:
46    case LCD_MODE_STN_DUAL_PANEL_4_BIT:
47    case LCD_MODE_STN_DUAL_PANEL_8_BIT:
48    case LCD_MODE_TFT_12_BIT_4_4_4:
49    case LCD_MODE_TFT_16_BIT_5_6_5:
50    case LCD_MODE_TFT_16_BIT_1_5_5_5:
51    case LCD_MODE_TFT_24_BIT:
52      enable = true;
53      break;
54    case LCD_MODE_DISABLED:
55      enable = false;
56      break;
57    default:
58      sc = RTEMS_IO_ERROR;
59      break;
60  }
61
62  if (sc == RTEMS_SUCCESSFUL) {
63    if (enable) {
64      sc = lpc24xx_module_enable(LPC24XX_MODULE_LCD, LPC24XX_MODULE_PCLK_DEFAULT);
65      assert(sc == RTEMS_SUCCESSFUL);
66
67      #ifdef ARM_MULTILIB_ARCH_V4
68        PINSEL11 = BSP_FLD32(mode, 1, 3) | LCD_ENABLE;
69      #endif
70
71      sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_FUNCTION);
72      assert(sc == RTEMS_SUCCESSFUL);
73    } else {
74      if (lpc24xx_lcd_current_mode() != LCD_MODE_DISABLED) {
75        uint32_t lcd_ctrl = LCD_CTRL;
76
77        /* Disable power */
78        lcd_ctrl &= ~BSP_BIT32(11);
79        LCD_CTRL = lcd_ctrl;
80
81        lpc24xx_micro_seconds_delay(100000);
82
83        /* Disable all signals */
84        lcd_ctrl &= ~BSP_BIT32(0);
85        LCD_CTRL = lcd_ctrl;
86      }
87
88      sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_INPUT);
89      assert(sc == RTEMS_SUCCESSFUL);
90
91      #ifdef ARM_MULTILIB_ARCH_V4
92        PINSEL11 = 0;
93      #endif
94
95      sc = lpc24xx_module_disable(LPC24XX_MODULE_LCD);
96      assert(sc == RTEMS_SUCCESSFUL);
97    }
98  }
99
100  return sc;
101}
102
103lpc24xx_lcd_mode lpc24xx_lcd_current_mode(void)
104{
105  #ifdef ARM_MULTILIB_ARCH_V4
106    uint32_t pinsel11 = PINSEL11;
107
108    if ((PCONP & BSP_BIT32(20)) != 0 && (pinsel11 & LCD_ENABLE) != 0) {
109      return BSP_FLD32GET(pinsel11, 1, 3);
110    } else {
111      return LCD_MODE_DISABLED;
112    }
113  #else
114    volatile lpc17xx_scb *scb = &LPC17XX_SCB;
115
116    if ((scb->pconp & LPC17XX_SCB_PCONP_LCD) != 0) {
117      return LCD_CTRL & 0xae;
118    } else {
119      return LCD_MODE_DISABLED;
120    }
121  #endif
122}
Note: See TracBrowser for help on using the repository browser.