File indexing completed on 2025-05-11 08:23:03
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <assert.h>
0037
0038 #include <bsp/lpc24xx.h>
0039 #include <bsp/lcd.h>
0040 #include <bsp/lpc-lcd.h>
0041 #include <bsp/utility.h>
0042 #include <bsp/system-clocks.h>
0043
0044 #ifdef ARM_MULTILIB_ARCH_V4
0045 #define LCD_ENABLE BSP_BIT32(0)
0046 #endif
0047
0048 rtems_status_code lpc24xx_lcd_set_mode(
0049 lpc24xx_lcd_mode mode,
0050 const lpc24xx_pin_range *pins
0051 )
0052 {
0053 rtems_status_code sc = RTEMS_SUCCESSFUL;
0054 bool enable = false;
0055
0056 switch (mode) {
0057 case LCD_MODE_STN_4_BIT:
0058 case LCD_MODE_STN_8_BIT:
0059 case LCD_MODE_STN_DUAL_PANEL_4_BIT:
0060 case LCD_MODE_STN_DUAL_PANEL_8_BIT:
0061 case LCD_MODE_TFT_12_BIT_4_4_4:
0062 case LCD_MODE_TFT_16_BIT_5_6_5:
0063 case LCD_MODE_TFT_16_BIT_1_5_5_5:
0064 case LCD_MODE_TFT_24_BIT:
0065 enable = true;
0066 break;
0067 case LCD_MODE_DISABLED:
0068 enable = false;
0069 break;
0070 default:
0071 sc = RTEMS_IO_ERROR;
0072 break;
0073 }
0074
0075 if (sc == RTEMS_SUCCESSFUL) {
0076 if (enable) {
0077 sc = lpc24xx_module_enable(LPC24XX_MODULE_LCD, LPC24XX_MODULE_PCLK_DEFAULT);
0078 assert(sc == RTEMS_SUCCESSFUL);
0079
0080 #ifdef ARM_MULTILIB_ARCH_V4
0081 PINSEL11 = BSP_FLD32(mode, 1, 3) | LCD_ENABLE;
0082 #endif
0083
0084 sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_FUNCTION);
0085 assert(sc == RTEMS_SUCCESSFUL);
0086 } else {
0087 if (lpc24xx_lcd_current_mode() != LCD_MODE_DISABLED) {
0088 uint32_t lcd_ctrl = LCD_CTRL;
0089
0090
0091 lcd_ctrl &= ~BSP_BIT32(11);
0092 LCD_CTRL = lcd_ctrl;
0093
0094 lpc24xx_micro_seconds_delay(100000);
0095
0096
0097 lcd_ctrl &= ~BSP_BIT32(0);
0098 LCD_CTRL = lcd_ctrl;
0099 }
0100
0101 sc = lpc24xx_pin_config(pins, LPC24XX_PIN_SET_INPUT);
0102 assert(sc == RTEMS_SUCCESSFUL);
0103
0104 #ifdef ARM_MULTILIB_ARCH_V4
0105 PINSEL11 = 0;
0106 #endif
0107
0108 sc = lpc24xx_module_disable(LPC24XX_MODULE_LCD);
0109 assert(sc == RTEMS_SUCCESSFUL);
0110 }
0111 }
0112
0113 return sc;
0114 }
0115
0116 lpc24xx_lcd_mode lpc24xx_lcd_current_mode(void)
0117 {
0118 #ifdef ARM_MULTILIB_ARCH_V4
0119 uint32_t pinsel11 = PINSEL11;
0120
0121 if ((PCONP & BSP_BIT32(20)) != 0 && (pinsel11 & LCD_ENABLE) != 0) {
0122 return BSP_FLD32GET(pinsel11, 1, 3);
0123 } else {
0124 return LCD_MODE_DISABLED;
0125 }
0126 #else
0127 volatile lpc17xx_scb *scb = &LPC17XX_SCB;
0128
0129 if ((scb->pconp & LPC17XX_SCB_PCONP_LCD) != 0) {
0130 return LCD_CTRL & 0xae;
0131 } else {
0132 return LCD_MODE_DISABLED;
0133 }
0134 #endif
0135 }