1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2008-03-29     Yi.Qiu
9  * 2011-06-13     lgnq         modified for FM3 easy kit
10  */
11 #ifndef __LCD_H__
12 #define __LCD_H__
13 
14 #include <rtthread.h>
15 #include "mb9bf506r.h"
16 
17 /********* LCD Hardward Interface *************
18 LCD_CS      PORT1.7
19 LCD_CD      PORT1.6
20 LCD_WR      PORT1.5
21 LCD_RD      PORT1.4
22 LCD_SCK     PORT1.3
23 LCD_MOSI    PORT1.2
24 LCD_C86     PORT1.1
25 LCD_PS      PORT1.0
26 LCD_DATA[0..7]      PORT5.[0..7]
27 ***********************************************/
28 #define LCD_CS                  (1UL << 7)
29 #define LCD_CS_DDR              (FM3_GPIO->DDR1)
30 #define LCD_CS_PFR              (FM3_GPIO->PFR1)
31 #define LCD_CS_PDOR             (FM3_GPIO->PDOR1)
32 
33 #define LCD_CD                  (1UL << 6)
34 #define LCD_CD_DDR              (FM3_GPIO->DDR1)
35 #define LCD_CD_PFR              (FM3_GPIO->PFR1)
36 #define LCD_CD_PDOR             (FM3_GPIO->PDOR1)
37 
38 #define LCD_PS                  (1UL << 0)
39 #define LCD_PS_DDR              (FM3_GPIO->DDR1)
40 #define LCD_PS_PFR              (FM3_GPIO->PFR1)
41 #define LCD_PS_PDOR             (FM3_GPIO->PDOR1)
42 
43 #define LCD_CLK                 (1UL << 6)
44 #define LCD_CLK_DDR             (FM3_GPIO->DDR5)
45 #define LCD_CLK_PFR             (FM3_GPIO->PFR5)
46 #define LCD_CLK_PDOR            (FM3_GPIO->PDOR5)
47 
48 #define LCD_DATA                (1UL << 7)
49 #define LCD_DATA_DDR            (FM3_GPIO->DDR5)
50 #define LCD_DATA_PFR            (FM3_GPIO->PFR5)
51 #define LCD_DATA_PDOR           (FM3_GPIO->PDOR5)
52 
53 /* LCD driver for ZYMG12864C3 */
54 #define LCD_WIDTH               128
55 #define LCD_HEIGHT              64
56 
57 // Driver the LCD with Parallel or serial interface and the command/data control pin is gpio
58 #define LCD_CS_HIGH()           LCD_CS_PDOR  |=  LCD_CS
59 #define LCD_CS_LOW()            LCD_CS_PDOR  &= ~LCD_CS
60 
61 #define LCD_CD_HIGH()           LCD_CD_PDOR |=  LCD_CD
62 #define LCD_CD_LOW()            LCD_CD_PDOR &= ~LCD_CD
63 
64 #define LCD_PS_HIGH()           LCD_PS_PDOR |=  LCD_PS
65 #define LCD_PS_LOW()            LCD_PS_PDOR &= ~LCD_PS
66 
67 #define LCD_CLK_HIGH()          LCD_CLK_PDOR |=  LCD_CLK
68 #define LCD_CLK_LOW()           LCD_CLK_PDOR &= ~LCD_CLK
69 
70 #define LCD_DATA_HIGH()         LCD_DATA_PDOR |=  LCD_DATA
71 #define LCD_DATA_LOW()          LCD_DATA_PDOR &= ~LCD_DATA
72 
73 // define the arrtibute of ZYMG12864(LCM)
74 #define GUI_LCM_XMAX            128     // defined the lcd's line-number is 128
75 #define GUI_LCM_YMAX            64      // defined the lcd's column-number is 64
76 #define GUI_LCM_PAGE            8       // defined the lcd's page-number is 8(GUI_LCM_YMAX/8)
77 
78 /* set LCD command */
79 #define DISPLAY_ON              0xAF    // A0,RD,WR:010
80 #define DISPLAY_OFF             0xAE    // A0,RD,WR:010
81 
82 #define SET_START_LINE_0        0x40    // A0,RD,WR:010; line0~line63
83 #define SET_PAGE_ADDR_0         0xB0    // A0,RD,WR:010; addr0~addr8
84 #define SET_COLH_ADDR_0         0x10    // A0,RD,WR:010;
85 #define SET_COLL_ADDR_0         0x00    // A0,RD,WR:010; addr0~addr131
86 
87 #define READ_STATUS             0x-0    // A0,RD,WR:001; BUSY | ADC | ON/OFF |  RESET | 0 0 0 0
88 #define STATUS_BUSY             0x80
89 #define STATUS_ADC_REVERSE      0x40    // column address 131-n : SEG n, else column address n : SEG n
90 #define STATUS_DISPLAY_OFF      0x20
91 #define STATUS_RESET            0x80
92 
93 #define WRITE_DATA              0x--    // A0,RD,WR:110
94 #define READ_DATE               0x--    // A0,RD,WR:101; spi mode is unavailable
95 
96 #define SET_ADC_NORMAL          0xA0    // A0,RD,WR:010
97 #define SET_ADC_REVERSE         0xA1    // A0,RD,WR:010
98 #define DISPLAY_NORMAL          0xA6    // A0,RD,WR:010
99 #define DISPLAY_REVERSE         0xA7    // A0,RD,WR:010; reverse color
100 #define DISPLAY_ALL_ON          0xA5    // A0,RD,WR:010
101 #define DISPLAY_ALL_NORMAL      0xA4    // A0,RD,WR:010
102 
103 /*************************************************************
104 *   bias:   1/65duty | 1/49duty | 1/33duty | 1/55duty | 1/53duty *
105 *   ---------------|----------|----------|----------|--------- *
106 *   A2:     1/9 bias | 1/8 bias | 1/6 bias | 1/8 bias | 1/8 bias *
107 *   A3:     1/7 bias | 1/6 bias | 1/5 bias | 1/6 bias | 1/6 bias *
108 **************************************************************/
109 
110 #define SET_LCD_BIAS_7          0xA3    // A0,RD,WR:010
111 #define SET_LCD_BIAS_9          0xA2    // A0,RD,WR:010
112 
113 #define RMW_MODE_ENABLE         0xE0    // A0,RD,WR:010; the column address locked when read command operating
114 #define RMW_MODE_END            0xEE    // A0,RD,WR:010; returns to the column address when RMW was entered.
115 #define RESET_LCD               0xE2    // A0,RD,WR:010
116 
117 
118 /**************************************************************************************
119 *   Com Scan Dir:   |   1/65duty        | 1/49duty      | 1/33duty      | 1/55duty      | 1/53duty      *
120 *   --------------|-------------|-------------|-------------|------------------------   *
121 *   C0:     Normal  |   COM0:COM63  |   COM0:COM47  |   COM0:COM31  |   COM0:COM53  |   COM0:COM51  *
122 *   C8:     Reverse |   COM63:COM0  |   COM47:COM0  |   COM31:COM0  |   COM53:COM0  |   COM51:COM0  *
123 ***************************************************************************************/
124 
125 #define COM_SCAN_DIR_NORMAL     0xC0    // A0,RD,WR:010
126 #define COM_SCAN_DIR_REVERSE    0xC8    // A0,RD,WR:010
127 
128 // 0 0 1 0 1 | Booster On | Regulator On | Follower On
129 #define POWER_BOOSTER_ON        0x2C    // A0,RD,WR:010
130 #define POWER_REGULATOR_ON      0x2E    // A0,RD,WR:010
131 #define POWER_FOLLOWER_ON       0x2F    // A0,RD,WR:010
132 
133 #define SET_RESISTOR_RATIO      0x20    // A0,RD,WR:010; 20~27:small~large
134 
135 #define SET_ELECVOL_MODE        0x81    // A0,RD,WR:010; double byte command
136 #define SET_ELECVOL_REG         0x20    // A0,RD,WR:010; the electronic volume(64 voltage levels:00~3F) function is not used.
137 
138 #define SLEEP_MODE_ENABLE       0xAC    // A0,RD,WR:010; double byte command, preceding command
139 #define SLEEP_MODE_DISABLE      0xAD    // A0,RD,WR:010; preceding command
140 #define SLEEP_MODE_DELIVER      0x00    // A0,RD,WR:010; following command
141 
142 #define BOOST_RATIO_SET         0xF8    // A0,RD,WR:010; double byte command, preceding command
143 #define BOOST_RATIO_234         0x00    // A0,RD,WR:010; following command
144 #define BOOST_RATIO_5           0x01    // A0,RD,WR:010; following command
145 #define BOOST_RATIO_6           0x03    // A0,RD,WR:010; following command
146 
147 #define COMMAND_NOP             0xE3    // A0,RD,WR:010
148 #define COMMAND_IC_TEST         0xFC    // A0,RD,WR:010; don't use
149 
150 #define RT_DEVICE_CTRL_LCD_GET_WIDTH            0
151 #define RT_DEVICE_CTRL_LCD_GET_HEIGHT           1
152 #define RT_DEVICE_CTRL_LCD_GET_BPP              2
153 #define RT_DEVICE_CTRL_LCD_GET_FRAMEBUFFER      3
154 #define RT_DEVICE_CTRL_LCD_POWER_ON             4
155 #define RT_DEVICE_CTRL_LCD_POWER_OFF            5
156 #define RT_DEVICE_CTRL_LCD_CLEAR_SCR            6
157 #define RT_DEVICE_CTRL_LCD_FILL_ALL             7
158 #define RT_DEVICE_CTRL_LCD_UPDATE_POINT         8
159 #define RT_DEVICE_CTRL_LCD_DISPLAY_ON           9
160 #define RT_DEVICE_CTRL_LCD_DISPLAY_OFF          10
161 #define RT_DEVICE_CTRL_LCD_PUT_STRING           11
162 
163 enum
164 {
165     ADC_MSG,
166     KEY_MSG,
167     CPU_MSG,
168     MAX_MSG,
169 };
170 
171 struct lcd_msg
172 {
173     rt_uint8_t  type;
174     rt_uint16_t adc_value;
175     rt_uint8_t  key;
176     rt_uint16_t major;
177     rt_uint16_t minor;
178 };
179 
180 extern rt_uint32_t x;
181 extern rt_uint32_t y;
182 
183 void rt_hw_lcd_init(void);
184 
185 #endif
186