]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_LPC1768_GCC_RedSuite/src/LCD/lcd_driver.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_LPC1768_GCC_RedSuite / src / LCD / lcd_driver.c
1 //*****************************************************************************\r
2 //   +--+       \r
3 //   | ++----+   \r
4 //   +-++    |  \r
5 //     |     |  \r
6 //   +-+--+  |   \r
7 //   | +--+--+  \r
8 //   +----+    Copyright (c) 2009 Code Red Technologies Ltd. \r
9 //\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
12 //\r
13 //\r
14 // Software License Agreement\r
15 // \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
21 // \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
28 \r
29 #include "NXP/LPC17xx/LPC17xx.h"\r
30 #include "lcd_driver.h"\r
31 #include "lcd_commands.h"\r
32 \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
39 \r
40 // Bit within GPIO port 3 used for LCD driver\r
41 #define LCD_RESB_PIN           (1<<25)\r
42 \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
46 \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
51 \r
52 #define LCD_CSB_CLR             FIO2CLR\r
53 #define LCD_CSB_SET             FIO2SET\r
54 \r
55 #define LCD_RESB_CLR    FIO3CLR\r
56 #define LCD_RESB_SET    FIO3SET\r
57 \r
58 #define LCD_A0_CLR              FIO2CLR\r
59 #define LCD_A0_SET              FIO2SET\r
60 \r
61 #define LCD_WR_CLR              FIO2CLR\r
62 #define LCD_WR_SET              FIO2SET\r
63 \r
64 #define LCD_RD_CLR              FIO2CLR\r
65 #define LCD_RD_SET              FIO2SET\r
66 \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
70 {\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
77 }\r
78 \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
83 {\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
92 }\r
93 \r
94 // Function to add short delays in writing things to the LCD.\r
95 void ms_delay(int n)\r
96 {\r
97    volatile int d;\r
98    for (d=0; d<n*3000; d++){}\r
99 }\r
100 \r
101 \r
102 // Initialize GPIO connection to the LCD driver\r
103 void LCDdriver_ConfigGPIOtoLCD(void)\r
104 {\r
105     // set direction to outputs \r
106         FIO2DIR |= LCD_PORT2_DIRECTIONS;        \r
107         FIO3DIR |= LCD_PORT3_DIRECTIONS;\r
108         \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
116 \r
117 }\r
118 \r
119 \r
120 // Initialisation routine to set up LCD\r
121 void LCDdriver_initialisation(void)\r
122 {\r
123         int i;          // temp loop variable\r
124         \r
125         LCDdriver_ConfigGPIOtoLCD();            // Initialize the GPIO for the display\r
126 \r
127         LCDdriver_WriteCom(DD_SWRESET);         // SW reset\r
128         ms_delay(120);                                          // Small delay\r
129 \r
130         LCDdriver_WriteCom(DD_AUTOLOADSET);     // disable auto loading of mask rom data\r
131         LCDdriver_WriteData(0xBF);\r
132 \r
133         LCDdriver_WriteCom(DD_EPCTIN);                  // OTP control mode=read\r
134         LCDdriver_WriteData(0x00);\r
135         ms_delay(10);                                                   // Small delay\r
136 \r
137         LCDdriver_WriteCom(DD_EPREAD);                  // Start the OTP read.\r
138         ms_delay(20);                                                   // Small delay\r
139 \r
140         LCDdriver_WriteCom(DD_EPCTOUT);         // Cancel the OTP read (20ms should have been enough)\r
141 \r
142         LCDdriver_WriteCom(DD_DISPOFF);         // display off\r
143 \r
144         LCDdriver_WriteCom(DD_SLPOUT);                  // Exit sleep mode.\r
145         ms_delay(50);                                                   // Small delay\r
146 \r
147         LCDdriver_WriteCom(DD_VopSet);                  // set LCD operating voltage to 14V.\r
148         LCDdriver_WriteData(0x04);\r
149         LCDdriver_WriteData(0x01);\r
150 \r
151         LCDdriver_WriteCom(DD_BiasSel);         // Select an LCD bias voltage ratio of 1/12.\r
152         LCDdriver_WriteData(0x00);\r
153 \r
154         LCDdriver_WriteCom(DD_BstMbpXSel);              // x8 booster circuit on\r
155         LCDdriver_WriteData(0x07);\r
156 \r
157         LCDdriver_WriteCom(DD_ColScanDir);              // Invert the column scan direction for the panel.\r
158         LCDdriver_WriteData(0xC0);\r
159 \r
160         LCDdriver_WriteCom(DD_COLORMOD);                // 16bpp, 5-6-5 data input mode.\r
161         LCDdriver_WriteData(0x05);\r
162         \r
163         LCDdriver_WriteCom(DD_MADCTR);                  // mem scan direction\r
164         LCDdriver_WriteData(0x00);\r
165         \r
166         LCDdriver_WriteCom(DD_DISPON);                  // display on\r
167 \r
168         // Now Clear the Screen\r
169         LCDdriver_WriteCom(DD_CASET);\r
170         LCDdriver_WriteData(0x00);\r
171         LCDdriver_WriteData(0x7F);\r
172 \r
173         LCDdriver_WriteCom(DD_RASET);\r
174         LCDdriver_WriteData(0x01);\r
175         LCDdriver_WriteData(0x80);\r
176 \r
177         LCDdriver_WriteCom(DD_RAMWR);\r
178         for(i = 0; i < (128 * 128); i++)\r
179         {\r
180                 LCDdriver_WriteData(0x00);\r
181                 LCDdriver_WriteData(0x00);\r
182         }\r
183 \r
184         LCDdriver_WriteCom(DD_NORON);                   // normal operation mode\r
185 }\r
186 \r
187 \r
188 \r
189 \r
190 \r