1 /*
2 * Allwinner SoCs display driver.
3 *
4 * Copyright (C) 2016 Allwinner.
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11 #include "VVX07H005A10.h"
12 #include "../disp_sys_intf.h"
13
14 static void LCD_power_on(u32 sel);
15 static void LCD_power_off(u32 sel);
16 static void LCD_bl_open(u32 sel);
17 static void LCD_bl_close(u32 sel);
18
19 static void LCD_panel_init(u32 sel);
20 static void LCD_panel_exit(u32 sel);
21 static __s32 LCD_user_defined_func(__u32 sel, __u32 para1, __u32 para2, __u32 para3);
22
23 // #define LCD_DEBUG
24 #ifdef LCD_DEBUG
25 #define DEBUG(fmt, args...) printf("[DEBUG] %s, %s, %d " fmt "\n", __FILE__, __func__, __LINE__, ## args)
26 #else
27 #define DEBUG(fmt, args...)
28 #endif
29
30 #define dsi_dcs_wr_0para sunxi_lcd_dsi_dcs_write_0para
31 #define dsi_dcs_wr_1para sunxi_lcd_dsi_dcs_write_1para
32 #define dsi_dcs_wr_2para sunxi_lcd_dsi_dcs_write_2para
33 #define dsi_dcs_wr_3para sunxi_lcd_dsi_dcs_write_3para
34 #define dsi_dcs_wr_4para sunxi_lcd_dsi_dcs_write_4para
35 #define dsi_dcs_wr_5para sunxi_lcd_dsi_dcs_write_5para
36 #define dsi_dcs_wr_6para sunxi_lcd_dsi_dcs_write_6para
37 #define dsi_dcs_wr_longpara sunxi_lcd_dsi_dcs_write
38 #define delayms sunxi_lcd_delay_ms
39
tft7201280_init(__u32 sel,__u32 mode,__u32 lane,__u32 format)40 static void tft7201280_init(__u32 sel, __u32 mode, __u32 lane, __u32 format)
41 {
42 //-----------------------Initial Code--------------------------------------//
43 //Page0
44 dsi_dcs_wr_1para(sel,0xE0,0x00);
45
46 //--- PASSWORD ----//
47 dsi_dcs_wr_1para(sel,0xE1,0x93);
48 dsi_dcs_wr_1para(sel,0xE2,0x65);
49 dsi_dcs_wr_1para(sel,0xE3,0xF8);
50 dsi_dcs_wr_1para(sel,0x80,0x03);
51
52
53
54 //--- Page1 ----//
55 dsi_dcs_wr_1para(sel,0xE0,0x01);
56
57 //Set VCOM
58 dsi_dcs_wr_1para(sel,0x01,0x67);
59
60 //Set Gamma Power, VGMP,VGMN,VGSP,VGSN
61 dsi_dcs_wr_1para(sel,0x17,0x00);
62 dsi_dcs_wr_1para(sel,0x18,0xBF);//4.5V, D7=4.8V
63 dsi_dcs_wr_1para(sel,0x19,0x01);//0.0V
64 dsi_dcs_wr_1para(sel,0x1A,0x00);
65 dsi_dcs_wr_1para(sel,0x1B,0xBF);
66 dsi_dcs_wr_1para(sel,0x1C,0x01);
67 dsi_dcs_wr_1para(sel,0x0C,0x74);
68
69 //Set Gate Power
70 dsi_dcs_wr_1para(sel,0x1F,0x70); //VGH_REG=16.2V
71 dsi_dcs_wr_1para(sel,0x20,0x2D); //VGL_REG=-12V
72 dsi_dcs_wr_1para(sel,0x21,0x2D); //VGL_REG2=-12V
73 dsi_dcs_wr_1para(sel,0x22,0x7E);
74 dsi_dcs_wr_1para(sel,0x0C,0x74);
75
76
77 dsi_dcs_wr_1para(sel,0x35,0x28); //SAP
78
79 dsi_dcs_wr_1para(sel,0x37,0x19); //SS=1,BGR=1
80
81 //SET RGBCYC
82 dsi_dcs_wr_1para(sel,0x38,0x05); //JDT=101 zigzag inversion
83 dsi_dcs_wr_1para(sel,0x39,0x00);
84 dsi_dcs_wr_1para(sel,0x3A,0x01);
85 dsi_dcs_wr_1para(sel,0x3C,0x7C); //SET EQ3 for TE_H
86 dsi_dcs_wr_1para(sel,0x3D,0xFF); //SET CHGEN_ON, modify 20140806
87 dsi_dcs_wr_1para(sel,0x3E,0xFF); //SET CHGEN_OFF, modify 20140806
88 dsi_dcs_wr_1para(sel,0x3F,0x7F); //SET CHGEN_OFF2, modify 20140806
89
90
91 //Set TCON
92 dsi_dcs_wr_1para(sel,0x40,0x06); //RSO=
93 dsi_dcs_wr_1para(sel,0x41,0xA0); //LN=640->1280 line
94 dsi_dcs_wr_1para(sel,0x43,0x1E); //VFP=30
95 dsi_dcs_wr_1para(sel,0x44,0x0B); //VBP=12
96 dsi_dcs_wr_1para(sel,0x45,0x28); //HBP=40
97
98 //--- power voltage ----//
99 dsi_dcs_wr_1para(sel,0x55,0x01);
100 dsi_dcs_wr_1para(sel,0x57,0xA9);
101 //dsi_dcs_wr_1para(sel,0x58,0x0A);
102 dsi_dcs_wr_1para(sel,0x59,0x0A); //VCL = -2.5V
103 dsi_dcs_wr_1para(sel,0x5A,0x2E); //VGH = 16.2V
104 dsi_dcs_wr_1para(sel,0x5B,0x1A); //VGL = -12V
105 dsi_dcs_wr_1para(sel,0x5C,0x15); //pump clk
106
107
108 //--- Gamma ----//
109 dsi_dcs_wr_1para(sel,0x5D,0x7F);
110 dsi_dcs_wr_1para(sel,0x5E,0x64);
111 dsi_dcs_wr_1para(sel,0x5F,0x53);
112 dsi_dcs_wr_1para(sel,0x60,0x47);
113 dsi_dcs_wr_1para(sel,0x61,0x43);
114 dsi_dcs_wr_1para(sel,0x62,0x33);
115 dsi_dcs_wr_1para(sel,0x63,0x37);
116 dsi_dcs_wr_1para(sel,0x64,0x21);
117 dsi_dcs_wr_1para(sel,0x65,0x39);
118 dsi_dcs_wr_1para(sel,0x66,0x37);
119 dsi_dcs_wr_1para(sel,0x67,0x34);
120 dsi_dcs_wr_1para(sel,0x68,0x50);
121 dsi_dcs_wr_1para(sel,0x69,0x3D);
122 dsi_dcs_wr_1para(sel,0x6A,0x44);
123 dsi_dcs_wr_1para(sel,0x6B,0x36);
124 dsi_dcs_wr_1para(sel,0x6C,0x34);
125 dsi_dcs_wr_1para(sel,0x6D,0x25);
126 dsi_dcs_wr_1para(sel,0x6E,0x15);
127 dsi_dcs_wr_1para(sel,0x6F,0x02);
128 dsi_dcs_wr_1para(sel,0x70,0x7F);
129 dsi_dcs_wr_1para(sel,0x71,0x64);
130 dsi_dcs_wr_1para(sel,0x72,0x53);
131 dsi_dcs_wr_1para(sel,0x73,0x47);
132 dsi_dcs_wr_1para(sel,0x74,0x43);
133 dsi_dcs_wr_1para(sel,0x75,0x33);
134 dsi_dcs_wr_1para(sel,0x76,0x37);
135 dsi_dcs_wr_1para(sel,0x77,0x21);
136 dsi_dcs_wr_1para(sel,0x78,0x39);
137 dsi_dcs_wr_1para(sel,0x79,0x37);
138 dsi_dcs_wr_1para(sel,0x7A,0x34);
139 dsi_dcs_wr_1para(sel,0x7B,0x50);
140 dsi_dcs_wr_1para(sel,0x7C,0x3D);
141 dsi_dcs_wr_1para(sel,0x7D,0x44);
142 dsi_dcs_wr_1para(sel,0x7E,0x36);
143 dsi_dcs_wr_1para(sel,0x7F,0x34);
144 dsi_dcs_wr_1para(sel,0x80,0x25);
145 dsi_dcs_wr_1para(sel,0x81,0x15);
146 dsi_dcs_wr_1para(sel,0x82,0x02);
147
148
149 //Page2, for GIP
150 dsi_dcs_wr_1para(sel,0xE0,0x02);
151
152 //GIP_L Pin mapping
153 dsi_dcs_wr_1para(sel,0x00,0x52);//RESET_EVEN
154 dsi_dcs_wr_1para(sel,0x01,0x55);//VSSG_EVEN
155 dsi_dcs_wr_1para(sel,0x02,0x55);//VSSG_EVEN
156 dsi_dcs_wr_1para(sel,0x03,0x50);//STV2_ODD
157 dsi_dcs_wr_1para(sel,0x04,0x77);//VDD2_ODD
158 dsi_dcs_wr_1para(sel,0x05,0x57);//VDD1_ODD
159 dsi_dcs_wr_1para(sel,0x06,0x55);//x
160 dsi_dcs_wr_1para(sel,0x07,0x4E);//CK11
161 dsi_dcs_wr_1para(sel,0x08,0x4C);//CK9
162 dsi_dcs_wr_1para(sel,0x09,0x5F);//x
163 dsi_dcs_wr_1para(sel,0x0A,0x4A);//CK7
164 dsi_dcs_wr_1para(sel,0x0B,0x48);//CK5
165 dsi_dcs_wr_1para(sel,0x0C,0x55);//x
166 dsi_dcs_wr_1para(sel,0x0D,0x46);//CK3
167 dsi_dcs_wr_1para(sel,0x0E,0x44);//CK1
168 dsi_dcs_wr_1para(sel,0x0F,0x40);//STV1_ODD
169 dsi_dcs_wr_1para(sel,0x10,0x55);//x
170 dsi_dcs_wr_1para(sel,0x11,0x55);//x
171 dsi_dcs_wr_1para(sel,0x12,0x55);//x
172 dsi_dcs_wr_1para(sel,0x13,0x55);//x
173 dsi_dcs_wr_1para(sel,0x14,0x55);//x
174 dsi_dcs_wr_1para(sel,0x15,0x55);//x
175
176 //GIP_R Pin mapping
177 dsi_dcs_wr_1para(sel,0x16,0x53);//RESET__EVEN
178 dsi_dcs_wr_1para(sel,0x17,0x55);//VSSG_EVEN
179 dsi_dcs_wr_1para(sel,0x18,0x55);//VSSG_EVEN
180 dsi_dcs_wr_1para(sel,0x19,0x51);//STV2_EVEN
181 dsi_dcs_wr_1para(sel,0x1A,0x77);//VDD2_EVEN
182 dsi_dcs_wr_1para(sel,0x1B,0x57);//VDD1_EVEN
183 dsi_dcs_wr_1para(sel,0x1C,0x55);//x
184 dsi_dcs_wr_1para(sel,0x1D,0x4F);//CK12
185 dsi_dcs_wr_1para(sel,0x1E,0x4D);//CK10
186 dsi_dcs_wr_1para(sel,0x1F,0x5F);//x
187 dsi_dcs_wr_1para(sel,0x20,0x4B);//CK8
188 dsi_dcs_wr_1para(sel,0x21,0x49);//CK6
189 dsi_dcs_wr_1para(sel,0x22,0x55);//x
190 dsi_dcs_wr_1para(sel,0x23,0x47);//CK4
191 dsi_dcs_wr_1para(sel,0x24,0x45);//CK2
192 dsi_dcs_wr_1para(sel,0x25,0x41);//STV1_EVEN
193 dsi_dcs_wr_1para(sel,0x26,0x55);//x
194 dsi_dcs_wr_1para(sel,0x27,0x55);//x
195 dsi_dcs_wr_1para(sel,0x28,0x55);//x
196 dsi_dcs_wr_1para(sel,0x29,0x55);//x
197 dsi_dcs_wr_1para(sel,0x2A,0x55);//x
198 dsi_dcs_wr_1para(sel,0x2B,0x55);//x
199
200 //GIP_L_GS Pin mapping
201 dsi_dcs_wr_1para(sel,0x2C,0x13);//RESET_EVEN
202 dsi_dcs_wr_1para(sel,0x2D,0x15);//VSSG_EVEN
203 dsi_dcs_wr_1para(sel,0x2E,0x15);//VSSG_EVEN
204 dsi_dcs_wr_1para(sel,0x2F,0x01);//STV2_ODD
205 dsi_dcs_wr_1para(sel,0x30,0x37);//VDD2_ODD
206 dsi_dcs_wr_1para(sel,0x31,0x17);//VDD1_ODD
207 dsi_dcs_wr_1para(sel,0x32,0x15);//x
208 dsi_dcs_wr_1para(sel,0x33,0x0D);//CK11
209 dsi_dcs_wr_1para(sel,0x34,0x0F);//CK9
210 dsi_dcs_wr_1para(sel,0x35,0x15);//x
211 dsi_dcs_wr_1para(sel,0x36,0x05);//CK7
212 dsi_dcs_wr_1para(sel,0x37,0x07);//CK5
213 dsi_dcs_wr_1para(sel,0x38,0x15);//x
214 dsi_dcs_wr_1para(sel,0x39,0x09);//CK3
215 dsi_dcs_wr_1para(sel,0x3A,0x0B);//CK1
216 dsi_dcs_wr_1para(sel,0x3B,0x11);//STV1_ODD
217 dsi_dcs_wr_1para(sel,0x3C,0x15);//x
218 dsi_dcs_wr_1para(sel,0x3D,0x15);//x
219 dsi_dcs_wr_1para(sel,0x3E,0x15);//x
220 dsi_dcs_wr_1para(sel,0x3F,0x15);//x
221 dsi_dcs_wr_1para(sel,0x40,0x15);//x
222 dsi_dcs_wr_1para(sel,0x41,0x15);//x
223
224 //GIP_R_GS Pin mapping
225 dsi_dcs_wr_1para(sel,0x42,0x12);//RESET__EVEN
226 dsi_dcs_wr_1para(sel,0x43,0x15);//VSSG_EVEN
227 dsi_dcs_wr_1para(sel,0x44,0x15);//VSSG_EVEN
228 dsi_dcs_wr_1para(sel,0x45,0x00);//STV2_EVEN
229 dsi_dcs_wr_1para(sel,0x46,0x37);//VDD2_EVEN
230 dsi_dcs_wr_1para(sel,0x47,0x17);//VDD1_EVEN
231 dsi_dcs_wr_1para(sel,0x48,0x15);//x
232 dsi_dcs_wr_1para(sel,0x49,0x0C);//CK12
233 dsi_dcs_wr_1para(sel,0x4A,0x0E);//CK10
234 dsi_dcs_wr_1para(sel,0x4B,0x15);//x
235 dsi_dcs_wr_1para(sel,0x4C,0x04);//CK8
236 dsi_dcs_wr_1para(sel,0x4D,0x06);//CK6
237 dsi_dcs_wr_1para(sel,0x4E,0x15);//x
238 dsi_dcs_wr_1para(sel,0x4F,0x08);//CK4
239 dsi_dcs_wr_1para(sel,0x50,0x0A);//CK2
240 dsi_dcs_wr_1para(sel,0x51,0x10);//STV1_EVEN
241 dsi_dcs_wr_1para(sel,0x52,0x15);//x
242 dsi_dcs_wr_1para(sel,0x53,0x15);//x
243 dsi_dcs_wr_1para(sel,0x54,0x15);//x
244 dsi_dcs_wr_1para(sel,0x55,0x15);//x
245 dsi_dcs_wr_1para(sel,0x56,0x15);//x
246 dsi_dcs_wr_1para(sel,0x57,0x15);//x
247
248 //GIP Timing
249 dsi_dcs_wr_1para(sel,0x58,0x40);
250 dsi_dcs_wr_1para(sel,0x5B,0x10);
251 dsi_dcs_wr_1para(sel,0x5C,0x06);//STV_S0
252 dsi_dcs_wr_1para(sel,0x5D,0x40);
253 dsi_dcs_wr_1para(sel,0x5E,0x00);
254 dsi_dcs_wr_1para(sel,0x5F,0x00);
255 dsi_dcs_wr_1para(sel,0x60,0x40);//ETV_W
256 dsi_dcs_wr_1para(sel,0x61,0x03);
257 dsi_dcs_wr_1para(sel,0x62,0x04);
258 dsi_dcs_wr_1para(sel,0x63,0x6C);//CKV_ON
259 dsi_dcs_wr_1para(sel,0x64,0x6C);//CKV_OFF
260 dsi_dcs_wr_1para(sel,0x65,0x75);
261 dsi_dcs_wr_1para(sel,0x66,0x08);//ETV_S0
262 dsi_dcs_wr_1para(sel,0x67,0xB4); //ckv_num/ckv_w
263 dsi_dcs_wr_1para(sel,0x68,0x08); //CKV_S0
264 dsi_dcs_wr_1para(sel,0x69,0x6C);//CKV_ON
265 dsi_dcs_wr_1para(sel,0x6A,0x6C);//CKV_OFF
266 dsi_dcs_wr_1para(sel,0x6B,0x0C); //dummy
267 dsi_dcs_wr_1para(sel,0x6D,0x00);//GGND1
268 dsi_dcs_wr_1para(sel,0x6E,0x00);//GGND2
269 dsi_dcs_wr_1para(sel,0x6F,0x88);
270
271 dsi_dcs_wr_1para(sel,0x75,0xBB);//FLM_EN
272 dsi_dcs_wr_1para(sel,0x76,0x00);
273 dsi_dcs_wr_1para(sel,0x77,0x05);
274 dsi_dcs_wr_1para(sel,0x78,0x2A);//FLM_OFF
275
276 //Page4
277 dsi_dcs_wr_1para(sel,0xE0,0x04);
278 dsi_dcs_wr_1para(sel,0x09,0x11);
279 dsi_dcs_wr_1para(sel,0x0E,0x48); //Source EQ option
280 dsi_dcs_wr_1para(sel,0x2B,0x2B);
281 dsi_dcs_wr_1para(sel,0x2D,0x03);//defult 0x01
282 dsi_dcs_wr_1para(sel,0x2E,0x44);
283
284 //Page5
285 dsi_dcs_wr_1para(sel,0xE0,0x05);
286 dsi_dcs_wr_1para(sel,0x12,0x72);//VCI GAS detect voltage
287
288 //Page0
289 dsi_dcs_wr_1para(sel,0xE0,0x00);
290 dsi_dcs_wr_1para(sel,0xE6,0x02);//WD_Timer
291 dsi_dcs_wr_1para(sel,0xE7,0x0C);//WD_Timer
292
293 //SLP OUT
294 dsi_dcs_wr_0para(sel,0x01);
295 dsi_dcs_wr_0para(sel,0x11); // SLPOUT
296 delayms(120);
297
298
299 //DISP ON
300 dsi_dcs_wr_0para(sel,0x01);
301 dsi_dcs_wr_0para(sel,0x29); // DSPON
302 delayms(5);
303
304 }
305
tft7201280_init_s(__u32 sel,__u32 mode,__u32 lane,__u32 format)306 static void tft7201280_init_s(__u32 sel,__u32 mode,__u32 lane,__u32 format)
307 {
308 __u8 tmp1[15]={0x6c,0x12,0x12,0x34,0x04,0x11,0xF1,0x80,0xE5,0x95,0x23,0x80,0xc0,0xd2,0x58};
309 __u8 tmp2[12]={0x00,0xFF,0x01,0x5A,0x01,0x5A,0x01,0x5A,0x01,0x70,0x01,0x70};
310 __u8 tmp3[37]={0x00,0x06,0x00,0x01,0x07,0x00,0x00,0x32,0x10,0x08,0x00,0x08,0x52,0x15,0x0E,0x05,0x0E,0x32,0x10,0x00,0x00,0x00,0x37,0x33,0x0C,0x0C,0x37,0x0C,0x0C,0x47,0x08,0x00,0x00,0x00,0x0A,0x00,0x01};
311 __u8 tmp4[44]={0x1B,0x1B,0x1A,0x1A,0x06,0x07,0x02,0x03,0x04,0x05,0x00,0x01,0x20,0x21,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x18,0x24,0x19,0x18,0x25};
312 __u8 tmp5[44]={0x1B,0x1B,0x1A,0x1A,0x01,0x00,0x05,0x04,0x03,0x02,0x07,0x06,0x25,0x24,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x18,0x18,0x19,0x21,0x18,0x18,0x20};
313 __u8 tmp6[42]={0x00,0x06,0x17,0x0F,0x10,0x3f,0x2C,0x37,0x0A,0x0F,0x11,0x19,0x10,0x15,0x17,0x15,0x15,0x07,0x13,0x15,0x19,0x00,0x06,0x17,0x0F,0x10,0x3F,0x2C,0x37,0x0A,0x0F,0x11,0x19,0x10,0x15,0x17,0x15,0x15,0x07,0x13,0x15,0x19};
314 __u8 tmp7[42]={0x00,0x16,0x1E,0x0E,0x0C,0x39,0x2E,0x3B,0x09,0x0D,0x0F,0x19,0x11,0x14,0x17,0x15,0x15,0x08,0x14,0x15,0x16,0x00,0x12,0x1B,0x0E,0x0C,0x39,0x26,0x2E,0x08,0x0E,0x0F,0x18,0x10,0x14,0x17,0x15,0x16,0x08,0x14,0x15,0x16};
315
316 //-----------------------Initial Code--------------------------------------//
317 //password
318 dsi_dcs_wr_3para(sel,0xB9,0xFF,0x83,0x94);
319 delayms(1);
320
321 //setting mipi 4-lane
322 dsi_dcs_wr_2para(sel,0xBA,0x33,0x83);
323 delayms(1);
324
325 dsi_dcs_wr_longpara(sel,0xB1,tmp1,15);
326 delayms(1);
327
328 //set display
329 dsi_dcs_wr_6para(sel,0xB2,0x00,0x64,0x10,0x07,0x32,0x1C);
330 delayms(1);
331
332 //setting CYC
333 dsi_dcs_wr_longpara(sel,0xB4,tmp2,12);
334 delayms(1);
335
336 //set d3
337 dsi_dcs_wr_longpara(sel,0xD3,tmp3,37);
338 delayms(1);
339
340 //setting SCAN RGB
341 dsi_dcs_wr_1para(sel,0xCC,0x0B);
342 delayms(1);
343
344 //setting GIP
345 dsi_dcs_wr_longpara(sel,0xD5,tmp4,44);
346 delayms(1);
347
348 //set D6
349 dsi_dcs_wr_longpara(sel,0xD6,tmp5,44);
350 delayms(1);
351
352 //set VOCN option
353 dsi_dcs_wr_4para(sel,0xC7,0x00,0xC0,0x00,0xC0);
354 delayms(1);
355
356 dsi_dcs_wr_1para(sel,0xC6,0x1D);
357
358 //setting Gamma
359 dsi_dcs_wr_longpara(sel,0xE0,tmp6,42);
360
361 //dsi_dcs_wr_longpara(sel,0xE0,tmp7,42);
362 delayms(10);
363
364 //setting sleep out
365 dsi_dcs_wr_0para(sel,0x11);
366 delayms(20);
367
368 dsi_dcs_wr_2para(sel,0xB6,0x32,0x32);
369
370 //setting Display
371 dsi_dcs_wr_0para(sel,0x29); // DSPON
372 delayms(10);
373
374 }
375
376
LCD_cfg_panel_info(struct panel_extend_para * info)377 static void LCD_cfg_panel_info(struct panel_extend_para *info)
378 {
379 u32 i = 0, j = 0;
380 u32 items;
381 u8 lcd_gamma_tbl[][2] = {
382 /* {input value, corrected value} */
383 {0, 0},
384 {15, 15},
385 {30, 30},
386 {45, 45},
387 {60, 60},
388 {75, 75},
389 {90, 90},
390 {105, 105},
391 {120, 120},
392 {135, 135},
393 {150, 150},
394 {165, 165},
395 {180, 180},
396 {195, 195},
397 {210, 210},
398 {225, 225},
399 {240, 240},
400 {255, 255},
401 };
402
403 u32 lcd_cmap_tbl[2][3][4] = {
404 {
405 {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
406 {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
407 {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
408 },
409 {
410 {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
411 {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
412 {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
413 },
414 };
415
416 items = sizeof(lcd_gamma_tbl) / 2;
417 for (i = 0; i < items - 1; i++) {
418 u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
419
420 for (j = 0; j < num; j++) {
421 u32 value = 0;
422
423 value =
424 lcd_gamma_tbl[i][1] +
425 ((lcd_gamma_tbl[i + 1][1] -
426 lcd_gamma_tbl[i][1]) * j) / num;
427 info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
428 (value << 16) + (value << 8) + value;
429 }
430 }
431 info->lcd_gamma_tbl[255] =
432 (lcd_gamma_tbl[items - 1][1] << 16) +
433 (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
434
435 memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
436
437 }
438
LCD_open_flow(u32 sel)439 static s32 LCD_open_flow(u32 sel)
440 {
441 LCD_OPEN_FUNC(sel, LCD_power_on, 15); //open lcd power, and delay 10ms
442 LCD_OPEN_FUNC(sel, LCD_panel_init, 30); //open lcd power, than delay 50ms
443 LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 30); //open lcd controller, and delay 50ms
444 LCD_OPEN_FUNC(sel, LCD_bl_open, 0); //open lcd backlight, and delay 0ms
445
446 return 0;
447 }
448
LCD_close_flow(u32 sel)449 static s32 LCD_close_flow(u32 sel)
450 {
451 LCD_CLOSE_FUNC(sel, LCD_bl_close, 0); //close lcd backlight, and delay 0ms
452 LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0); //close lcd controller, and delay 0ms
453 LCD_CLOSE_FUNC(sel, LCD_panel_exit, 20); //open lcd power, than delay 20ms
454 LCD_CLOSE_FUNC(sel, LCD_power_off, 50); //close lcd power, and delay 50ms
455 return 0;
456 }
457
LCD_power_on(u32 sel)458 static void LCD_power_on(u32 sel)
459 {
460 sunxi_lcd_power_enable(sel, 0);//config lcd_power pin to open lcd power0
461 sunxi_lcd_pin_cfg(sel, 1);
462 }
463
LCD_power_off(u32 sel)464 static void LCD_power_off(u32 sel)
465 {
466 sunxi_lcd_pin_cfg(sel, 0);
467 sunxi_lcd_power_disable(sel, 0);//config lcd_power pin to close lcd power0
468 sunxi_lcd_dsi_clk_disable(sel);
469 }
470
LCD_bl_open(u32 sel)471 static void LCD_bl_open(u32 sel)
472 {
473 sunxi_lcd_pwm_enable(sel);
474 sunxi_lcd_backlight_enable(sel);//config lcd_bl_en pin to open lcd backlight
475 }
476
LCD_bl_close(u32 sel)477 static void LCD_bl_close(u32 sel)
478 {
479 sunxi_lcd_backlight_disable(sel);//config lcd_bl_en pin to close lcd backlight
480 sunxi_lcd_pwm_disable(sel);
481 }
482
LCD_panel_init(u32 sel)483 static void LCD_panel_init(u32 sel)
484 {
485 #if 0
486 // 有的屏需要初始化,在这里添加。比如hv屏可能需要spi或则iic初始化,
487 // dsi屏,用LP_TX模式初始化
488 struct disp_panel_para *panel_info = malloc(sizeof(struct disp_panel_para));
489
490 bsp_disp_get_panel_info(sel, panel_info);
491 sunxi_lcd_dsi_clk_enable(sel);
492 tft7201280_init_s(sel, panel_info->lcd_dsi_if, panel_info->lcd_dsi_lane, panel_info->lcd_dsi_format);
493
494 disp_sys_free(panel_info);
495 #else
496 struct disp_panel_para *panel_info = malloc(sizeof(struct disp_panel_para));
497
498 bsp_disp_get_panel_info(sel, panel_info);
499 sunxi_lcd_dsi_clk_enable(sel);
500 //tft7201280_init(sel, panel_info->lcd_dsi_if, panel_info->lcd_dsi_lane, panel_info->lcd_dsi_format);
501
502 disp_sys_free(panel_info);
503 #endif
504 return;
505 }
506
LCD_panel_exit(u32 sel)507 static void LCD_panel_exit(u32 sel)
508 {
509 sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SET_DISPLAY_OFF);
510 sunxi_lcd_delay_ms(50);
511 sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_ENTER_SLEEP_MODE);
512 sunxi_lcd_delay_ms(20);
513 }
514
515 /* sel: 0:lcd0; 1:lcd1 */
LCD_user_defined_func(u32 sel,u32 para1,u32 para2,u32 para3)516 static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
517 {
518 return 0;
519 }
520
521 struct __lcd_panel VVX07H005A10_panel = {
522 /* panel driver name, must mach the lcd_drv_name in sys_config.fex */
523 .name = "VVX07H005A10",
524 .func = {
525 .cfg_panel_info = LCD_cfg_panel_info,
526 .cfg_open_flow = LCD_open_flow,
527 .cfg_close_flow = LCD_close_flow,
528 .lcd_user_defined_func = LCD_user_defined_func,
529 }
530 ,
531 };
532