1 //*****************************************************************************
\r
8 // +----+ Copyright (c) 2009 Code Red Technologies Ltd.
\r
10 // lcd_driver.c contains the lowest level access routines for the Sitronix
\r
11 // ST7637 LCD Controller/driver used on the RDB1768 development board.
\r
14 // Software License Agreement
\r
16 // The software is owned by Code Red Technologies and/or its suppliers, and is
\r
17 // protected under applicable copyright laws. All rights are reserved. Any
\r
18 // use in violation of the foregoing restrictions may subject the user to criminal
\r
19 // sanctions under applicable laws, as well as to civil liability for the breach
\r
20 // of the terms and conditions of this license.
\r
22 // THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
\r
23 // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
\r
24 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
\r
25 // USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT
\r
26 // TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH
\r
27 // CODE RED TECHNOLOGIES LTD.
\r
29 #include "NXP/LPC17xx/LPC17xx.h"
\r
30 #include "lcd_driver.h"
\r
31 #include "lcd_commands.h"
\r
33 // Bits within GPIO port 2 used for LCD driver
\r
34 #define LCD_CSB_PIN (1<<13)
\r
35 #define LCD_A0_PIN (1<<8)
\r
36 #define LCD_WR_PIN (1<<11)
\r
37 #define LCD_RD_PIN (1<<12)
\r
38 #define LCD_DATA_PIN 0xff
\r
40 // Bit within GPIO port 3 used for LCD driver
\r
41 #define LCD_RESB_PIN (1<<25)
\r
43 // Bits to configure as outputs for driving LCD
\r
44 #define LCD_PORT2_DIRECTIONS (LCD_CSB_PIN | LCD_A0_PIN | LCD_WR_PIN | LCD_RD_PIN | LCD_DATA_PIN)
\r
45 #define LCD_PORT3_DIRECTIONS (LCD_RESB_PIN)
\r
47 // Define names for GPIO port 2 and 3 registers to better indicate in code
\r
48 // the operation being carried out on the LCD driver hardware.
\r
49 #define LCD_DATA_CLR FIO2CLR
\r
50 #define LCD_DATA_SET FIO2SET
\r
52 #define LCD_CSB_CLR FIO2CLR
\r
53 #define LCD_CSB_SET FIO2SET
\r
55 #define LCD_RESB_CLR FIO3CLR
\r
56 #define LCD_RESB_SET FIO3SET
\r
58 #define LCD_A0_CLR FIO2CLR
\r
59 #define LCD_A0_SET FIO2SET
\r
61 #define LCD_WR_CLR FIO2CLR
\r
62 #define LCD_WR_SET FIO2SET
\r
64 #define LCD_RD_CLR FIO2CLR
\r
65 #define LCD_RD_SET FIO2SET
\r
67 // Routine to write data to LCD driver. Normally called in combination
\r
68 // with LCDdriver_WriteCom() routine
\r
69 void LCDdriver_WriteData(unsigned char LCD_Data)
\r
71 LCD_DATA_CLR = LCD_DATA_PIN;
\r
72 LCD_DATA_SET = LCD_Data;
\r
73 LCD_CSB_CLR = LCD_CSB_PIN;
\r
74 LCD_WR_CLR = LCD_WR_PIN;
\r
75 LCD_WR_SET = LCD_WR_PIN;
\r
76 LCD_CSB_SET = LCD_CSB_PIN;
\r
79 // Routine to configure set LCD driver to accept particular command.
\r
80 // A call to this routine will normally be followed by a call
\r
81 // to LCDdriver_WriteData() to transfer appropriate parameters to driver.
\r
82 void LCDdriver_WriteCom(unsigned char LCD_Command)
\r
84 LCD_DATA_CLR = LCD_DATA_PIN;
\r
85 LCD_DATA_SET = LCD_Command;
\r
86 LCD_A0_CLR = LCD_A0_PIN;
\r
87 LCD_CSB_CLR = LCD_CSB_PIN;
\r
88 LCD_WR_CLR = LCD_WR_PIN;
\r
89 LCD_WR_SET = LCD_WR_PIN;
\r
90 LCD_CSB_SET = LCD_CSB_PIN;
\r
91 LCD_A0_SET = LCD_A0_PIN;
\r
94 // Function to add short delays in writing things to the LCD.
\r
95 void ms_delay(int n)
\r
98 for (d=0; d<n*3000; d++){}
\r
102 // Initialize GPIO connection to the LCD driver
\r
103 void LCDdriver_ConfigGPIOtoLCD(void)
\r
105 // set direction to outputs
\r
106 FIO2DIR |= LCD_PORT2_DIRECTIONS;
\r
107 FIO3DIR |= LCD_PORT3_DIRECTIONS;
\r
109 // Set GPIO outputs connected to LCD to default values
\r
110 LCD_CSB_SET = LCD_CSB_PIN;
\r
111 LCD_A0_SET = LCD_A0_PIN;
\r
112 LCD_WR_SET = LCD_WR_PIN;
\r
113 LCD_RD_SET = LCD_RD_PIN;
\r
114 LCD_RESB_SET = LCD_RESB_PIN;
\r
115 LCD_DATA_CLR = 0xff; // data bus to zero
\r
120 // Initialisation routine to set up LCD
\r
121 void LCDdriver_initialisation(void)
\r
123 int i; // temp loop variable
\r
125 LCDdriver_ConfigGPIOtoLCD(); // Initialize the GPIO for the display
\r
127 LCDdriver_WriteCom(DD_SWRESET); // SW reset
\r
128 ms_delay(120); // Small delay
\r
130 LCDdriver_WriteCom(DD_AUTOLOADSET); // disable auto loading of mask rom data
\r
131 LCDdriver_WriteData(0xBF);
\r
133 LCDdriver_WriteCom(DD_EPCTIN); // OTP control mode=read
\r
134 LCDdriver_WriteData(0x00);
\r
135 ms_delay(10); // Small delay
\r
137 LCDdriver_WriteCom(DD_EPREAD); // Start the OTP read.
\r
138 ms_delay(20); // Small delay
\r
140 LCDdriver_WriteCom(DD_EPCTOUT); // Cancel the OTP read (20ms should have been enough)
\r
142 LCDdriver_WriteCom(DD_DISPOFF); // display off
\r
144 LCDdriver_WriteCom(DD_SLPOUT); // Exit sleep mode.
\r
145 ms_delay(50); // Small delay
\r
147 LCDdriver_WriteCom(DD_VopSet); // set LCD operating voltage to 14V.
\r
148 LCDdriver_WriteData(0x04);
\r
149 LCDdriver_WriteData(0x01);
\r
151 LCDdriver_WriteCom(DD_BiasSel); // Select an LCD bias voltage ratio of 1/12.
\r
152 LCDdriver_WriteData(0x00);
\r
154 LCDdriver_WriteCom(DD_BstMbpXSel); // x8 booster circuit on
\r
155 LCDdriver_WriteData(0x07);
\r
157 LCDdriver_WriteCom(DD_ColScanDir); // Invert the column scan direction for the panel.
\r
158 LCDdriver_WriteData(0xC0);
\r
160 LCDdriver_WriteCom(DD_COLORMOD); // 16bpp, 5-6-5 data input mode.
\r
161 LCDdriver_WriteData(0x05);
\r
163 LCDdriver_WriteCom(DD_MADCTR); // mem scan direction
\r
164 LCDdriver_WriteData(0x00);
\r
166 LCDdriver_WriteCom(DD_DISPON); // display on
\r
168 // Now Clear the Screen
\r
169 LCDdriver_WriteCom(DD_CASET);
\r
170 LCDdriver_WriteData(0x00);
\r
171 LCDdriver_WriteData(0x7F);
\r
173 LCDdriver_WriteCom(DD_RASET);
\r
174 LCDdriver_WriteData(0x01);
\r
175 LCDdriver_WriteData(0x80);
\r
177 LCDdriver_WriteCom(DD_RAMWR);
\r
178 for(i = 0; i < (128 * 128); i++)
\r
180 LCDdriver_WriteData(0x00);
\r
181 LCDdriver_WriteData(0x00);
\r
184 LCDdriver_WriteCom(DD_NORON); // normal operation mode
\r