]> git.sur5r.net Git - freertos/blob
7c88231cb8e8619fb4a7223b6d00623df54f557e
[freertos] /
1 /*\r
2  * @brief LCD controller Registers and control functions\r
3  *\r
4  * @note\r
5  * Copyright(C) NXP Semiconductors, 2012\r
6  * All rights reserved.\r
7  *\r
8  * @par\r
9  * Software that is described herein is for illustrative purposes only\r
10  * which provides customers with programming information regarding the\r
11  * LPC products.  This software is supplied "AS IS" without any warranties of\r
12  * any kind, and NXP Semiconductors and its licensor disclaim any and\r
13  * all warranties, express or implied, including all implied warranties of\r
14  * merchantability, fitness for a particular purpose and non-infringement of\r
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility\r
16  * or liability for the use of the software, conveys no license or rights under any\r
17  * patent, copyright, mask work right, or any other intellectual property rights in\r
18  * or to any products. NXP Semiconductors reserves the right to make changes\r
19  * in the software without notification. NXP Semiconductors also makes no\r
20  * representation or warranty that such application will be suitable for the\r
21  * specified use without further testing or modification.\r
22  *\r
23  * @par\r
24  * Permission to use, copy, modify, and distribute this software and its\r
25  * documentation is hereby granted, under NXP Semiconductors' and its\r
26  * licensor's relevant copyrights in the software, without fee, provided that it\r
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This\r
28  * copyright, permission, and disclaimer notice must appear in all copies of\r
29  * this code.\r
30  */\r
31 \r
32 #ifndef __LCD_001_H_\r
33 #define __LCD_001_H_\r
34 \r
35 #include "sys_config.h"\r
36 #include "cmsis.h"\r
37 \r
38 #ifdef __cplusplus\r
39 extern "C" {\r
40 #endif\r
41 \r
42 /** @defgroup IP_LCD_001 IP: LCD register block and driver\r
43  * @ingroup IP_Drivers\r
44  * @{\r
45  */\r
46 \r
47 /**\r
48  * @brief LCD Controller register block structure\r
49  */\r
50 typedef struct {                                /*!< LCD Structure          */\r
51         __IO uint32_t  TIMH;            /*!< Horizontal Timing Control register */\r
52         __IO uint32_t  TIMV;            /*!< Vertical Timing Control register */\r
53         __IO uint32_t  POL;                     /*!< Clock and Signal Polarity Control register */\r
54         __IO uint32_t  LE;                      /*!< Line End Control register */\r
55         __IO uint32_t  UPBASE;          /*!< Upper Panel Frame Base Address register */\r
56         __IO uint32_t  LPBASE;          /*!< Lower Panel Frame Base Address register */\r
57         __IO uint32_t  CTRL;            /*!< LCD Control register   */\r
58         __IO uint32_t  INTMSK;          /*!< Interrupt Mask register */\r
59         __I  uint32_t  INTRAW;          /*!< Raw Interrupt Status register */\r
60         __I  uint32_t  INTSTAT;         /*!< Masked Interrupt Status register */\r
61         __O  uint32_t  INTCLR;          /*!< Interrupt Clear register */\r
62         __I  uint32_t  UPCURR;          /*!< Upper Panel Current Address Value register */\r
63         __I  uint32_t  LPCURR;          /*!< Lower Panel Current Address Value register */\r
64         __I  uint32_t  RESERVED0[115];\r
65         __IO uint16_t PAL[256];         /*!< 256x16-bit Color Palette registers */\r
66         __I  uint32_t  RESERVED1[256];\r
67         __IO uint32_t CRSR_IMG[256];/*!< Cursor Image registers */\r
68         __IO uint32_t  CRSR_CTRL;       /*!< Cursor Control register */\r
69         __IO uint32_t  CRSR_CFG;        /*!< Cursor Configuration register */\r
70         __IO uint32_t  CRSR_PAL0;       /*!< Cursor Palette register 0 */\r
71         __IO uint32_t  CRSR_PAL1;       /*!< Cursor Palette register 1 */\r
72         __IO uint32_t  CRSR_XY;         /*!< Cursor XY Position register */\r
73         __IO uint32_t  CRSR_CLIP;       /*!< Cursor Clip Position register */\r
74         __I  uint32_t  RESERVED2[2];\r
75         __IO uint32_t  CRSR_INTMSK;     /*!< Cursor Interrupt Mask register */\r
76         __O  uint32_t  CRSR_INTCLR;     /*!< Cursor Interrupt Clear register */\r
77         __I  uint32_t  CRSR_INTRAW;     /*!< Cursor Raw Interrupt Status register */\r
78         __I  uint32_t  CRSR_INTSTAT;/*!< Cursor Masked Interrupt Status register */\r
79 } IP_LCD_001_T;\r
80 \r
81 /**\r
82  * @brief LCD Palette entry format\r
83  */\r
84 typedef struct {\r
85         uint32_t Rl : 5;\r
86         uint32_t Gl : 5;\r
87         uint32_t Bl : 5;\r
88         uint32_t Il : 1;\r
89         uint32_t Ru : 5;\r
90         uint32_t Gu : 5;\r
91         uint32_t Bu : 5;\r
92         uint32_t Iu : 1;\r
93 } LCD_PALETTE_ENTRY_T;\r
94 \r
95 /**\r
96  * @brief LCD Panel type\r
97  */\r
98 typedef enum IP_LCD_PANEL_OPT {\r
99         LCD_TFT = 0x02,         /*!< standard TFT */\r
100         LCD_MONO_4 = 0x01,      /*!< 4-bit STN mono */\r
101         LCD_MONO_8 = 0x05,      /*!< 8-bit STN mono */\r
102         LCD_CSTN = 0x00         /*!< color STN */\r
103 } IP_LCD_PANEL_OPT_T;\r
104 \r
105 /**\r
106  * @brief LCD Color Format\r
107  */\r
108 typedef enum IP_LCD_COLOR_FORMAT_OPT {\r
109         LCD_COLOR_FORMAT_RGB = 0,\r
110         LCD_COLOR_FORMAT_BGR\r
111 } IP_LCD_COLOR_FORMAT_OPT_T;\r
112 \r
113 /** LCD Interrupt control mask register bits */\r
114 #define LCD_INTMSK_FUFIM   0x2  /*!< FIFO underflow interrupt enable */\r
115 #define LCD_INTMSK_LNBUIM  0x4  /*!< LCD next base address update interrupt enable */\r
116 #define LCD_INTMSK_VCOMPIM 0x8  /*!< Vertical compare interrupt enable */\r
117 #define LCD_INTMSK_BERIM   0x10 /*!< AHB master error interrupt enable */\r
118 \r
119 #define CLCDC_LCDCTRL_ENABLE    _BIT(0)         /*!< LCD control enable bit */\r
120 #define CLCDC_LCDCTRL_PWR       _BIT(11)        /*!< LCD control power enable bit */\r
121 \r
122 /**\r
123  * @brief A structure for LCD Configuration\r
124  */\r
125 typedef struct {\r
126         uint8_t  HBP;   /*!< Horizontal back porch in clocks */\r
127         uint8_t  HFP;   /*!< Horizontal front porch in clocks */\r
128         uint8_t  HSW;   /*!< HSYNC pulse width in clocks */\r
129         uint16_t PPL;   /*!< Pixels per line */\r
130         uint8_t  VBP;   /*!< Vertical back porch in clocks */\r
131         uint8_t  VFP;   /*!< Vertical front porch in clocks */\r
132         uint8_t  VSW;   /*!< VSYNC pulse width in clocks */\r
133         uint16_t LPP;   /*!< Lines per panel */\r
134         uint8_t  IOE;   /*!< Invert output enable, 1 = invert */\r
135         uint8_t  IPC;   /*!< Invert panel clock, 1 = invert */\r
136         uint8_t  IHS;   /*!< Invert HSYNC, 1 = invert */\r
137         uint8_t  IVS;   /*!< Invert VSYNC, 1 = invert */\r
138         uint8_t  ACB;   /*!< AC bias frequency in clocks (not used) */\r
139         uint8_t  BPP;   /*!< Maximum bits per pixel the display supports */\r
140         IP_LCD_PANEL_OPT_T  LCD;        /*!< LCD panel type */\r
141         IP_LCD_COLOR_FORMAT_OPT_T  color_format;        /*!<BGR or RGB */\r
142         uint8_t  Dual;  /*!< Dual panel, 1 = dual panel display */\r
143 } LCD_Config_T;\r
144 \r
145 /**\r
146  * @brief LCD Cursor Size\r
147  */\r
148 typedef enum IP_LCD_CURSOR_SIZE_OPT {\r
149         LCD_CURSOR_32x32 = 0,\r
150         LCD_CURSOR_64x64\r
151 } IP_LCD_CURSOR_SIZE_OPT_T;\r
152 \r
153 /**\r
154  * @brief       Enable Controller Interrupt\r
155  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
156  * @param       ints    : OR'ed interrupt bits to enable\r
157  * @return      None\r
158  */\r
159 STATIC INLINE void IP_LCD_EnableInts(IP_LCD_001_T *pLCD, uint32_t ints)\r
160 {\r
161         pLCD->INTMSK = ints;\r
162 }\r
163 \r
164 /**\r
165  * @brief       Disable Controller Interrupt\r
166  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
167  * @param       ints    : OR'ed interrupt bits to disable\r
168  * @return      None\r
169  */\r
170 STATIC INLINE void IP_LCD_DisableInts(IP_LCD_001_T *pLCD, uint32_t ints)\r
171 {\r
172         pLCD->INTMSK = pLCD->INTMSK & ~(ints);\r
173 }\r
174 \r
175 /**\r
176  * @brief       Clear Controller Interrupt\r
177  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
178  * @param       ints    : OR'ed interrupt bits to clear\r
179  * @return      None\r
180  */\r
181 STATIC INLINE void IP_LCD_ClearInts(IP_LCD_001_T *pLCD, uint32_t ints)\r
182 {\r
183         pLCD->INTCLR = pLCD->INTMSK & (ints);\r
184 }\r
185 \r
186 /**\r
187  * @brief       Power-on the LCD Panel (power pin)\r
188  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
189  * @return      None\r
190  */\r
191 STATIC INLINE void IP_LCD_PowerOn(IP_LCD_001_T *pLCD) {\r
192         volatile int i;\r
193         pLCD->CTRL |= CLCDC_LCDCTRL_PWR;\r
194         for (i = 0; i < 1000000; i++) {}\r
195         pLCD->CTRL |= CLCDC_LCDCTRL_ENABLE;\r
196 }\r
197 \r
198 /**\r
199  * @brief       Power-off the LCD Panel (power pin)\r
200  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
201  * @return      None\r
202  */\r
203 STATIC INLINE void IP_LCD_PowerOff(IP_LCD_001_T *pLCD) {\r
204         volatile int i;\r
205         pLCD->CTRL &= ~CLCDC_LCDCTRL_PWR;\r
206         for (i = 0; i < 1000000; i++) {}\r
207         pLCD->CTRL &= ~CLCDC_LCDCTRL_ENABLE;\r
208 }\r
209 \r
210 /**\r
211  * @brief       Enable the LCD Controller\r
212  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
213  * @return      None\r
214  */\r
215 STATIC INLINE void IP_LCD_Enable(IP_LCD_001_T *pLCD) {\r
216         pLCD->CTRL |= CLCDC_LCDCTRL_ENABLE;\r
217 }\r
218 \r
219 /**\r
220  * @brief       Enable the LCD Controller\r
221  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
222  * @return      None\r
223  */\r
224 STATIC INLINE void IP_LCD_Disable(IP_LCD_001_T *pLCD) {\r
225         pLCD->CTRL &= ~CLCDC_LCDCTRL_ENABLE;\r
226 }\r
227 \r
228 /**\r
229  * @brief       Set LCD Upper Panel Frame Buffer for Single Panel or Upper Panel Frame\r
230  *                      Buffer for Dual Panel\r
231  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
232  * @param       buffer  : address of buffer\r
233  * @return      None\r
234  */\r
235 STATIC INLINE void IP_LCD_SetUPFrameBuffer(IP_LCD_001_T *pLCD, void *buffer)\r
236 {\r
237         pLCD->UPBASE = (uint32_t) buffer;\r
238 }\r
239 \r
240 /**\r
241  * @brief       Set LCD Lower Panel Frame Buffer for Dual Panel\r
242  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
243  * @param       buffer  : address of buffer\r
244  * @return      None\r
245  */\r
246 STATIC INLINE void IP_LCD_SetLPFrameBuffer(IP_LCD_001_T *pLCD, void *buffer)\r
247 {\r
248         pLCD->LPBASE = (uint32_t) buffer;\r
249 }\r
250 \r
251 /**\r
252  * @brief       Configure Cursor\r
253  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
254  * @param       cursor_size     : specify size of cursor\r
255  *                  - LCD_CURSOR_32x32  :cursor size is 32x32 pixels\r
256  *                  - LCD_CURSOR_64x64  :cursor size is 64x64 pixels\r
257  * @param       sync            : cursor sync mode\r
258  *                  - TRUE      :cursor sync to the frame sync pulse\r
259  *                  - FALSE     :cursor async mode\r
260  * @return      None\r
261  */\r
262 STATIC INLINE void IP_LCD_Cursor_Config(IP_LCD_001_T *pLCD, IP_LCD_CURSOR_SIZE_OPT_T cursor_size, bool sync)\r
263 {\r
264         pLCD->CRSR_CFG = ((sync ? 1 : 0) << 1) | cursor_size;\r
265 }\r
266 \r
267 /**\r
268  * @brief       Get Internal Cursor Image Buffer Address\r
269  * @param       pLCD            : pointer to LCD Controller Reg Struct\r
270  * @param       cursor_num      : specify number of cursor is going to be written\r
271  *                                                      this param must < 4\r
272  * @return      Cursor Image Buffer Address\r
273  */\r
274 STATIC INLINE void *IP_LCD_Cursor_GetImageBufferAddress(IP_LCD_001_T *pLCD, uint8_t cursor_num)\r
275 {\r
276         return (void *) &(pLCD->CRSR_IMG[cursor_num * 64]);\r
277 }\r
278 \r
279 /**\r
280  * @brief       Enable Cursor\r
281  * @param       pLCD            : pointer to LCD Controller Reg Struct\r
282  * @param       cursor_num      : specify number of cursor is going to be written\r
283  *                                                      this param must < 4\r
284  * @return      None\r
285  */\r
286 STATIC INLINE void IP_LCD_Cursor_Enable(IP_LCD_001_T *pLCD, uint8_t cursor_num) {\r
287         pLCD->CRSR_CTRL = (cursor_num << 4) | 1;\r
288 }\r
289 \r
290 /**\r
291  * @brief       Disable Cursor\r
292  * @param       pLCD            : pointer to LCD Controller Reg Struct\r
293  * @param       cursor_num      : specify number of cursor is going to be written\r
294  *                                                      this param must < 4\r
295  * @return      None\r
296  */\r
297 STATIC INLINE void IP_LCD_Cursor_Disable(IP_LCD_001_T *pLCD, uint8_t cursor_num) {\r
298         pLCD->CRSR_CTRL = (cursor_num << 4);\r
299 }\r
300 \r
301 /**\r
302  * @brief       Load Cursor Palette\r
303  * @param       pLCD                    : pointer to LCD Controller Reg Struct\r
304  * @param       palette_color   : cursor palette 0 value\r
305  * @return      None\r
306  */\r
307 STATIC INLINE void IP_LCD_Cursor_LoadPalette0(IP_LCD_001_T *pLCD, uint32_t palette_color)\r
308 {\r
309         /* 7:0 - Red\r
310            15:8 - Green\r
311            23:16 - Blue\r
312            31:24 - Not used*/\r
313         pLCD->CRSR_PAL0 = (uint32_t) palette_color;\r
314 }\r
315 \r
316 /**\r
317  * @brief       Load Cursor Palette\r
318  * @param       pLCD                    : pointer to LCD Controller Reg Struct\r
319  * @param       palette_color   : cursor palette 1 value\r
320  * @return      None\r
321  */\r
322 STATIC INLINE void IP_LCD_Cursor_LoadPalette1(IP_LCD_001_T *pLCD, uint32_t palette_color)\r
323 {\r
324         /* 7:0 - Red\r
325                15:8 - Green\r
326                23:16 - Blue\r
327                31:24 - Not used*/\r
328         pLCD->CRSR_PAL1 = (uint32_t) palette_color;\r
329 \r
330 }\r
331 \r
332 /**\r
333  * @brief       Set Cursor Position\r
334  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
335  * @param       x               : horizontal position\r
336  * @param       y               : vertical position\r
337  * @return      None\r
338  */\r
339 STATIC INLINE void IP_LCD_Cursor_SetPos(IP_LCD_001_T *pLCD, uint16_t x, uint16_t y)\r
340 {\r
341         pLCD->CRSR_XY = (x & 0x3FF) | ((y & 0x3FF) << 16);\r
342 }\r
343 \r
344 /**\r
345  * @brief       Set Cursor Clipping Position\r
346  * @param       pLCD    : pointer to LCD Controller Reg Struct\r
347  * @param       x               : horizontal position, should be in range: 0..63\r
348  * @param       y               : vertical position, should be in range: 0..63\r
349  * @return      None\r
350  */\r
351 STATIC INLINE void IP_LCD_Cursor_SetClip(IP_LCD_001_T *pLCD, uint16_t x, uint16_t y)\r
352 {\r
353         pLCD->CRSR_CLIP = (x & 0x3F) | ((y & 0x3F) << 8);\r
354 }\r
355 \r
356 /**\r
357  * @brief       Load a color Palette entry\r
358  * @param       pLCD                    : pointer to LCD Controller Reg Struct\r
359  * @param       palette_addr    : Address of palette table to load from\r
360  * @param       index                   : palette entry index to load\r
361  * @return      None\r
362  */\r
363 STATIC INLINE void IP_LCD_Color_LoadPalette(IP_LCD_001_T *pLCD, uint32_t *palette_addr, uint32_t index)\r
364 {\r
365         pLCD->PAL[index] = *(uint32_t *) palette_addr;\r
366 }\r
367 \r
368 /**\r
369  * @brief       Initialize the LCD controller\r
370  * @param       pLCD                            : pointer to LCD Controller Reg Struct\r
371  * @param       LCD_ConfigStruct        : Pointer to LCD configuration\r
372  * @return  LCD_FUNC_OK is executed successfully or LCD_FUNC_ERR on error\r
373  */\r
374 void IP_LCD_Init(IP_LCD_001_T *pLCD, LCD_Config_T *LCD_ConfigStruct);\r
375 \r
376 /**\r
377  * @}\r
378  */\r
379 \r
380 #ifdef __cplusplus\r
381 }\r
382 #endif\r
383 \r
384 #endif /* __LCD_001_H_ */\r