source: rtems/bsps/arm/lpc24xx/fb/lcd.c @ 445ddb3

Last change on this file since 445ddb3 was 445ddb3, checked in by Joel Sherrill <joel@…>, on 06/27/22 at 13:48:16

bsps/arm/lpc24xx: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 3.8 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSBSPsARMLPC24XX_lcd
7 *
8 * @brief LCD support.
9 */
10
11/*
12 * Copyright (c) 2010-2012 embedded brains GmbH.  All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#include <assert.h>
37
38#include <bsp/lpc24xx.h>
39#include <bsp/lcd.h>
40#include <bsp/lpc-lcd.h>
41#include <bsp/utility.h>
42#include <bsp/system-clocks.h>
43
44#ifdef ARM_MULTILIB_ARCH_V4
45  #define LCD_ENABLE BSP_BIT32(0)
46#endif
47
48rtems_status_code lpc24xx_lcd_set_mode(
49  lpc24xx_lcd_mode mode,
50  const lpc24xx_pin_range *pins
51)
52{
53  rtems_status_code sc = RTEMS_SUCCESSFUL;
54  bool enable = false;
55
56  switch (mode) {
57    case LCD_MODE_STN_4_BIT:
58    case LCD_MODE_STN_8_BIT:
59    case LCD_MODE_STN_DUAL_PANEL_4_BIT:
60    case LCD_MODE_STN_DUAL_PANEL_8_BIT:
61    case LCD_MODE_TFT_12_BIT_4_4_4:
62    case LCD_MODE_TFT_16_BIT_5_6_5:
63    case LCD_MODE_TFT_16_BIT_1_5_5_5:
64    case LCD_MODE_TFT_24_BIT:
65      enable = true;
66      break;
67    case LCD_MODE_DISABLED:
68      enable = false;
69      break;
70    default:
71      sc = RTEMS_IO_ERROR;
72      break;
73  }
74
75  if (sc == RTEMS_SUCCESSFUL) {
76    if (enable) {
77      sc = lpc24xx_module_enable(LPC24XX_MODULE_LCD, LPC24XX_MODULE_PCLK_DEFAULT);
78      assert(sc == RTEMS_SUCCESSFUL);
79
80      #ifdef ARM_MULTILIB_ARCH_V4
81        PINSEL11 = BSP_FLD32(mode, 1, 3) | LCD_ENABLE;
82      #endif
83
84      sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_FUNCTION);
85      assert(sc == RTEMS_SUCCESSFUL);
86    } else {
87      if (lpc24xx_lcd_current_mode() != LCD_MODE_DISABLED) {
88        uint32_t lcd_ctrl = LCD_CTRL;
89
90        /* Disable power */
91        lcd_ctrl &= ~BSP_BIT32(11);
92        LCD_CTRL = lcd_ctrl;
93
94        lpc24xx_micro_seconds_delay(100000);
95
96        /* Disable all signals */
97        lcd_ctrl &= ~BSP_BIT32(0);
98        LCD_CTRL = lcd_ctrl;
99      }
100
101      sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_INPUT);
102      assert(sc == RTEMS_SUCCESSFUL);
103
104      #ifdef ARM_MULTILIB_ARCH_V4
105        PINSEL11 = 0;
106      #endif
107
108      sc = lpc24xx_module_disable(LPC24XX_MODULE_LCD);
109      assert(sc == RTEMS_SUCCESSFUL);
110    }
111  }
112
113  return sc;
114}
115
116lpc24xx_lcd_mode lpc24xx_lcd_current_mode(void)
117{
118  #ifdef ARM_MULTILIB_ARCH_V4
119    uint32_t pinsel11 = PINSEL11;
120
121    if ((PCONP & BSP_BIT32(20)) != 0 && (pinsel11 & LCD_ENABLE) != 0) {
122      return BSP_FLD32GET(pinsel11, 1, 3);
123    } else {
124      return LCD_MODE_DISABLED;
125    }
126  #else
127    volatile lpc17xx_scb *scb = &LPC17XX_SCB;
128
129    if ((scb->pconp & LPC17XX_SCB_PCONP_LCD) != 0) {
130      return LCD_CTRL & 0xae;
131    } else {
132      return LCD_MODE_DISABLED;
133    }
134  #endif
135}
Note: See TracBrowser for help on using the repository browser.