1 /*
2  * drivers/video/fbdev/sunxi/disp2/disp/lcd/ili9341/ili9341.c
3  *
4  * Copyright (c) 2007-2018 Allwinnertech Co., Ltd.
5  * Author: zhengxiaobin <zhengxiaobin@allwinnertech.com>
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15 
16 [lcd0]
17 lcd_used            = 1
18 
19 lcd_driver_name     = "ili9341"
20 lcd_x               = 240
21 lcd_y               = 320
22 lcd_width           = 108
23 lcd_height          = 64
24 lcd_dclk_freq       = 60
25 
26 lcd_pwm_used        = 0
27 lcd_pwm_ch          = 0
28 lcd_pwm_freq        = 50000
29 lcd_pwm_pol         = 1
30 lcd_pwm_max_limit   = 255
31 
32 lcd_hbp             = 20
33 ;10 + 20 + 10 + 240*3 = 760  real set 1000
34 lcd_ht              = 1000
35 lcd_hspw            = 10
36 lcd_vbp             = 5
37 lcd_vt              = 340
38 lcd_vspw            = 2
39 
40 lcd_frm             = 0
41 lcd_if              = 0
42 lcd_hv_if   = 8
43 lcd_hv_clk_phase    = 0
44 lcd_hv_sync_polarity   = 0
45 lcd_hv_srgb_seq     = 0
46 
47 lcd_io_phase        = 0x0000
48 lcd_gamma_en        = 0
49 lcd_bright_curve_en = 1
50 lcd_cmap_en         = 0
51 
52 
53 lcd_rb_swap = 0
54 
55 deu_mode            = 0
56 lcdgamma4iep        = 22
57 smart_color         = 90
58 
59 lcd_bl_en           = port:PB07<1><0><default><1>
60 lcd_power           = "axp233_dc1sw"
61 
62 ;reset
63 lcd_gpio_0          = port:PB06<1><0><default><1>
64 ;cs
65 lcd_gpio_1          = port:PD22<1><0><default><0>
66 ;sda
67 lcd_gpio_2          = port:PH08<1><0><default><0>
68 ;sck
69 lcd_gpio_3          = port:PH07<1><0><default><0>
70 
71 
72 lcdd3                = port:PD01<2><0><2><default>
73 lcdd4                = port:PD02<2><0><2><default>
74 lcdd5                = port:PD03<2><0><2><default>
75 lcdd6                = port:PD04<2><0><2><default>
76 lcdd7                = port:PD05<2><0><2><default>
77 lcdd10               = port:PD06<2><0><2><default>
78 lcdd11               = port:PD07<2><0><2><default>
79 lcdd12               = port:PD08<2><0><2><default>
80 
81 lcdclk              = port:PD18<2><0><3><default>
82 lcdde               = port:PD19<2><0><3><default>
83 lcdhsync            = port:PD20<2><0><3><default>
84 lcdvsync            = port:PD21<2><0><3><default>
85 [lcd0_suspend]
86 lcdd3                = port:PD01<7><0><2><default>
87 lcdd4                = port:PD02<7><0><2><default>
88 lcdd5                = port:PD03<7><0><2><default>
89 lcdd6                = port:PD04<7><0><2><default>
90 lcdd7                = port:PD05<7><0><2><default>
91 lcdd10               = port:PD06<7><0><2><default>
92 lcdd11               = port:PD07<7><0><2><default>
93 lcdd12               = port:PD08<7><0><2><default>
94 
95 lcdclk              = port:PD18<7><0><3><default>
96 lcdde               = port:PD19<7><0><3><default>
97 lcdhsync            = port:PD20<7><0><3><default>
98 lcdvsync            = port:PD21<7><0><3><default>
99  *
100  */
101 #include "ili9341.h"
102 
103 #define CPU_TRI_MODE
104 
105 #define ili9341c_spi_scl_1 sunxi_lcd_gpio_set_value(0, 3, 1)
106 #define ili9341c_spi_scl_0 sunxi_lcd_gpio_set_value(0, 3, 0)
107 #define ili9341c_spi_sdi_1 sunxi_lcd_gpio_set_value(0, 2, 1)
108 #define ili9341c_spi_sdi_0 sunxi_lcd_gpio_set_value(0, 2, 0)
109 #define ili9341c_spi_cs_1 sunxi_lcd_gpio_set_value(0, 1, 1)
110 #define ili9341c_spi_cs_0 sunxi_lcd_gpio_set_value(0, 1, 0)
111 
112 #define ili9341c_spi_reset_1 sunxi_lcd_gpio_set_value(0, 0, 1)
113 #define ili9341c_spi_reset_0 sunxi_lcd_gpio_set_value(0, 0, 0)
114 
115 static void lcd_panel_ili9341_init(struct disp_panel_para *info);
116 
117 static void LCD_power_on(u32 sel);
118 static void LCD_power_off(u32 sel);
119 static void LCD_bl_open(u32 sel);
120 static void LCD_bl_close(u32 sel);
121 
122 static void LCD_panel_init(u32 sel);
123 static void LCD_panel_exit(u32 sel);
124 
125 extern s32 tcon0_cpu_set_tri_mode(u32 sel);
126 
write_tcon_register(int offset,int value)127 void write_tcon_register(int offset, int value)
128 {
129     volatile int *tcon_reg = (int *)(0xf1c0c000 + offset);
130     int reg = 0;
131 
132     reg = *((volatile int *)tcon_reg);
133     reg |= value;
134     *((volatile int *)tcon_reg) = reg;
135 }
136 
lcd_cfg_panel_info(struct panel_extend_para * info)137 static void lcd_cfg_panel_info(struct panel_extend_para *info)
138 {
139     u32 i = 0, j = 0;
140     u32 items;
141     u8 lcd_gamma_tbl[][2] = {
142         //{input value, corrected value}
143         {0, 0},     {15, 15},   {30, 30},   {45, 45},   {60, 60},
144         {75, 75},   {90, 90},   {105, 105}, {120, 120}, {135, 135},
145         {150, 150}, {165, 165}, {180, 180}, {195, 195}, {210, 210},
146         {225, 225}, {240, 240}, {255, 255},
147     };
148 
149     u32 lcd_cmap_tbl[2][3][4] = {
150         {
151         {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
152         {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
153         {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
154         },
155         {
156         {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
157         {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
158         {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
159         },
160     };
161 
162     items = sizeof(lcd_gamma_tbl) / 2;
163     for (i = 0; i < items - 1; i++) {
164         u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
165 
166         for (j = 0; j < num; j++) {
167             u32 value = 0;
168 
169             value =
170                 lcd_gamma_tbl[i][1] +
171                 ((lcd_gamma_tbl[i + 1][1] - lcd_gamma_tbl[i][1]) *
172                  j) /
173                 num;
174             info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
175                 (value << 16) + (value << 8) + value;
176         }
177     }
178     info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items - 1][1] << 16) +
179                    (lcd_gamma_tbl[items - 1][1] << 8) +
180                    lcd_gamma_tbl[items - 1][1];
181     memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
182 }
183 
lcd_open_flow(u32 sel)184 static s32 lcd_open_flow(u32 sel)
185 {
186     LCD_OPEN_FUNC(sel, LCD_power_on, 40);
187 #ifdef CPU_TRI_MODE
188     LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
189     LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);
190 #else
191     LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);
192     LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
193 #endif
194     LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
195 
196     return 0;
197 }
198 
lcd_close_flow(u32 sel)199 static s32 lcd_close_flow(u32 sel)
200 {
201     LCD_CLOSE_FUNC(sel, LCD_bl_close, 50);
202 #ifdef CPU_TRI_MODE
203     LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 10);
204     LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);
205 #else
206     LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);
207     LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 10);
208 #endif
209     LCD_CLOSE_FUNC(sel, LCD_power_off, 10);
210 
211     return 0;
212 }
213 
LCD_power_on(u32 sel)214 static void LCD_power_on(u32 sel)
215 {
216     /*config lcd_power pin to open lcd power0*/
217     sunxi_lcd_power_enable(sel, 0);
218     /*pwr_en, active low*/
219     sunxi_lcd_gpio_set_value(sel, 3, 0);
220     sunxi_lcd_pin_cfg(sel, 1);
221 }
222 
LCD_power_off(u32 sel)223 static void LCD_power_off(u32 sel)
224 {
225     sunxi_lcd_pin_cfg(sel, 0);
226     /*pwr_en, active low*/
227     sunxi_lcd_gpio_set_value(sel, 3, 1);
228     /*config lcd_power pin to close lcd power0*/
229     sunxi_lcd_power_disable(sel, 0);
230 }
231 
LCD_bl_open(u32 sel)232 static void LCD_bl_open(u32 sel)
233 {
234     sunxi_lcd_pwm_enable(sel);
235     /*config lcd_bl_en pin to open lcd backlight*/
236     sunxi_lcd_backlight_enable(sel);
237 }
238 
LCD_bl_close(u32 sel)239 static void LCD_bl_close(u32 sel)
240 {
241     /*config lcd_bl_en pin to close lcd backlight*/
242     sunxi_lcd_backlight_disable(sel);
243     sunxi_lcd_pwm_disable(sel);
244 }
245 
LCD_WRITE_DATA(u32 value)246 static void LCD_WRITE_DATA(u32 value)
247 {
248     u32 i;
249     ili9341c_spi_cs_0;
250     ili9341c_spi_sdi_1;
251     ili9341c_spi_scl_0;
252     sunxi_lcd_delay_us(10);
253     ili9341c_spi_scl_1;
254     for (i = 0; i < 8; i++) {
255         sunxi_lcd_delay_us(10);
256         if (value & 0x80)
257             ili9341c_spi_sdi_1;
258         else
259             ili9341c_spi_sdi_0;
260         value <<= 1;
261         sunxi_lcd_delay_us(10);
262         ili9341c_spi_scl_0;
263         ili9341c_spi_scl_1;
264     }
265     sunxi_lcd_delay_us(10);
266     ili9341c_spi_cs_1;
267 }
268 
LCD_WRITE_COMMAND(u32 value)269 static void LCD_WRITE_COMMAND(u32 value)
270 {
271     u32 i;
272     ili9341c_spi_cs_0;
273     ili9341c_spi_sdi_0;
274     ili9341c_spi_scl_0;
275     sunxi_lcd_delay_us(10);
276     ili9341c_spi_scl_1;
277     for (i = 0; i < 8; i++) {
278         sunxi_lcd_delay_us(10);
279         if (value & 0x80)
280             ili9341c_spi_sdi_1;
281         else
282             ili9341c_spi_sdi_0;
283         ili9341c_spi_scl_0;
284         sunxi_lcd_delay_us(10);
285         ili9341c_spi_scl_1;
286         value <<= 1;
287     }
288     sunxi_lcd_delay_us(10);
289     ili9341c_spi_cs_1;
290 }
291 
LCD_panel_init(u32 sel)292 static void LCD_panel_init(u32 sel)
293 {
294     struct disp_panel_para *info =
295         kmalloc(sizeof(struct disp_panel_para), GFP_KERNEL | __GFP_ZERO);
296 
297     bsp_disp_get_panel_info(sel, info);
298     lcd_panel_ili9341_init(info);
299     disp_sys_free(info);
300     return;
301 }
302 
LCD_panel_exit(u32 sel)303 static void LCD_panel_exit(u32 sel)
304 {
305     struct disp_panel_para *info =
306         kmalloc(sizeof(struct disp_panel_para), GFP_KERNEL | __GFP_ZERO);
307 
308     LCD_WRITE_COMMAND(0x28);
309     LCD_WRITE_COMMAND(0x10);
310     sunxi_lcd_delay_ms(300);
311     bsp_disp_get_panel_info(sel, info);
312     disp_sys_free(info);
313     return;
314 }
315 
lcd_panel_ili9341_init(struct disp_panel_para * info)316 static void lcd_panel_ili9341_init(struct disp_panel_para *info)
317 {
318     //************* Start Initial Sequence **********//
319     //************* Reset LCD Driver ****************//
320     ili9341c_spi_reset_1;
321     sunxi_lcd_delay_ms(1);
322     ili9341c_spi_reset_0;
323     /*Delay 10ms  This delay time is necessary*/
324     sunxi_lcd_delay_ms(10);
325     ili9341c_spi_reset_1;
326     /*Delay 120 ms*/
327     sunxi_lcd_delay_ms(120);
328     /************** Start Initial Sequence ***********/
329     /*Pixel Format Set*/
330     LCD_WRITE_COMMAND(0x3A);
331     LCD_WRITE_DATA(0x55);
332     LCD_WRITE_COMMAND(0xF6);
333     LCD_WRITE_DATA(0x01);
334     LCD_WRITE_DATA(0x33);
335     LCD_WRITE_COMMAND(0xB5);
336     LCD_WRITE_DATA(0x04);
337     LCD_WRITE_DATA(0x04);
338     LCD_WRITE_DATA(0x0A);
339     LCD_WRITE_DATA(0x14);
340     LCD_WRITE_COMMAND(0x35);
341     LCD_WRITE_DATA(0x00);
342     LCD_WRITE_COMMAND(0xCF);
343     LCD_WRITE_DATA(0x00);
344     LCD_WRITE_DATA(0xEA);
345     LCD_WRITE_DATA(0xF0);
346     LCD_WRITE_COMMAND(0xED);
347     LCD_WRITE_DATA(0x64);
348     LCD_WRITE_DATA(0x03);
349     LCD_WRITE_DATA(0x12);
350     LCD_WRITE_DATA(0x81);
351     LCD_WRITE_COMMAND(0xE8);
352     LCD_WRITE_DATA(0x85);
353     LCD_WRITE_DATA(0x00);
354     LCD_WRITE_DATA(0x78);
355     LCD_WRITE_COMMAND(0xCB);
356     LCD_WRITE_DATA(0x39);
357     LCD_WRITE_DATA(0x2C);
358     LCD_WRITE_DATA(0x00);
359     LCD_WRITE_DATA(0x33);
360     LCD_WRITE_DATA(0x06);
361     LCD_WRITE_COMMAND(0xF7);
362     LCD_WRITE_DATA(0x20);
363     LCD_WRITE_COMMAND(0xEA);
364     LCD_WRITE_DATA(0x00);
365     LCD_WRITE_DATA(0x00);
366     /*VRH[5:0]*/
367     LCD_WRITE_COMMAND(0xC0);
368     LCD_WRITE_DATA(0x21);
369     LCD_WRITE_COMMAND(0xC1);
370     LCD_WRITE_DATA(0x10);
371     LCD_WRITE_COMMAND(0xC5);
372     LCD_WRITE_DATA(0x31);
373     LCD_WRITE_DATA(0x3C);
374     LCD_WRITE_COMMAND(0x36);
375     LCD_WRITE_DATA(0x08);
376     LCD_WRITE_COMMAND(0xB0);
377     /*E0,E9£¬D3£¬40*/
378     LCD_WRITE_DATA(0xE9);
379     LCD_WRITE_COMMAND(0xB1);
380     LCD_WRITE_DATA(0x00);
381     LCD_WRITE_DATA(0x13);
382     LCD_WRITE_COMMAND(0xB6);
383     LCD_WRITE_DATA(0x0A);
384     LCD_WRITE_DATA(0xA2);
385     LCD_WRITE_COMMAND(0xF2);
386     LCD_WRITE_DATA(0x02);
387     LCD_WRITE_COMMAND(0xF6);
388     LCD_WRITE_DATA(0x01);
389     LCD_WRITE_DATA(0x30);
390     LCD_WRITE_DATA(0x07);
391     LCD_WRITE_COMMAND(0x26);
392     LCD_WRITE_DATA(0x01);
393     LCD_WRITE_COMMAND(0xE0);
394     LCD_WRITE_DATA(0x0F);
395     LCD_WRITE_DATA(0x30);
396     LCD_WRITE_DATA(0x24);
397     LCD_WRITE_DATA(0x08);
398     LCD_WRITE_DATA(0x07);
399     LCD_WRITE_DATA(0x03);
400     LCD_WRITE_DATA(0x51);
401     LCD_WRITE_DATA(0x50);
402     LCD_WRITE_DATA(0x45);
403     LCD_WRITE_DATA(0x0a);
404     LCD_WRITE_DATA(0x15);
405     LCD_WRITE_DATA(0x04);
406     LCD_WRITE_DATA(0x10);
407     LCD_WRITE_DATA(0x40);
408     LCD_WRITE_DATA(0x00);
409     LCD_WRITE_COMMAND(0xE1);
410     LCD_WRITE_DATA(0x00);
411     LCD_WRITE_DATA(0x15);
412     LCD_WRITE_DATA(0x0a);
413     LCD_WRITE_DATA(0x12);
414     LCD_WRITE_DATA(0x07);
415     LCD_WRITE_DATA(0x13);
416     LCD_WRITE_DATA(0x21);
417     LCD_WRITE_DATA(0x22);
418     LCD_WRITE_DATA(0x38);
419     LCD_WRITE_DATA(0x32);
420     LCD_WRITE_DATA(0x06);
421     LCD_WRITE_DATA(0x03);
422     LCD_WRITE_DATA(0x20);
423     LCD_WRITE_DATA(0x2c);
424     LCD_WRITE_DATA(0x34);
425     LCD_WRITE_COMMAND(0x36);
426     LCD_WRITE_DATA(0x08);
427     LCD_WRITE_COMMAND(0x11);
428     sunxi_lcd_delay_ms(120);
429     LCD_WRITE_COMMAND(0x29);
430     /*Display on*/
431     LCD_WRITE_COMMAND(0x2C);
432 }
433 
lcd_reflush(void)434 void lcd_reflush(void)
435 {
436     /************** Start Initial Sequence ***********/
437     /************** Reset LCD Driver *****************/
438     ili9341c_spi_reset_1;
439     sunxi_lcd_delay_ms(1);
440     ili9341c_spi_reset_0;
441     /*Delay 10ms  This delay time is necessary*/
442     sunxi_lcd_delay_ms(10);
443     ili9341c_spi_reset_1;
444     /*Delay 120 ms*/
445     sunxi_lcd_delay_ms(120);
446     /************** Start Initial Sequence ***********/
447     /*Pixel Format Set*/
448     LCD_WRITE_COMMAND(0x3A);
449     LCD_WRITE_DATA(0x55);
450     LCD_WRITE_COMMAND(0xF6);
451     LCD_WRITE_DATA(0x01);
452     LCD_WRITE_DATA(0x33);
453     LCD_WRITE_COMMAND(0xB5);
454     LCD_WRITE_DATA(0x04);
455     LCD_WRITE_DATA(0x04);
456     LCD_WRITE_DATA(0x0A);
457     LCD_WRITE_DATA(0x14);
458     LCD_WRITE_COMMAND(0x35);
459     LCD_WRITE_DATA(0x00);
460     LCD_WRITE_COMMAND(0xCF);
461     LCD_WRITE_DATA(0x00);
462     LCD_WRITE_DATA(0xEA);
463     LCD_WRITE_DATA(0xF0);
464     LCD_WRITE_COMMAND(0xED);
465     LCD_WRITE_DATA(0x64);
466     LCD_WRITE_DATA(0x03);
467     LCD_WRITE_DATA(0x12);
468     LCD_WRITE_DATA(0x81);
469     LCD_WRITE_COMMAND(0xE8);
470     LCD_WRITE_DATA(0x85);
471     LCD_WRITE_DATA(0x00);
472     LCD_WRITE_DATA(0x78);
473     LCD_WRITE_COMMAND(0xCB);
474     LCD_WRITE_DATA(0x39);
475     LCD_WRITE_DATA(0x2C);
476     LCD_WRITE_DATA(0x00);
477     LCD_WRITE_DATA(0x33);
478     LCD_WRITE_DATA(0x06);
479     LCD_WRITE_COMMAND(0xF7);
480     LCD_WRITE_DATA(0x20);
481     LCD_WRITE_COMMAND(0xEA);
482     LCD_WRITE_DATA(0x00);
483     LCD_WRITE_DATA(0x00);
484     /*VRH[5:0]*/
485     LCD_WRITE_COMMAND(0xC0);
486     LCD_WRITE_DATA(0x21);
487     LCD_WRITE_COMMAND(0xC1);
488     LCD_WRITE_DATA(0x10);
489     LCD_WRITE_COMMAND(0xC5);
490     LCD_WRITE_DATA(0x4F);
491     LCD_WRITE_DATA(0x38);
492     LCD_WRITE_COMMAND(0x36);
493     LCD_WRITE_DATA(0x08);
494     LCD_WRITE_COMMAND(0xB0);
495     LCD_WRITE_DATA(0xE9);
496     LCD_WRITE_COMMAND(0xB1);
497     LCD_WRITE_DATA(0x00);
498     LCD_WRITE_DATA(0x13);
499     LCD_WRITE_COMMAND(0xB6);
500     LCD_WRITE_DATA(0x0A);
501     LCD_WRITE_DATA(0xA2);
502     LCD_WRITE_COMMAND(0xF2);
503     LCD_WRITE_DATA(0x02);
504     LCD_WRITE_COMMAND(0xF6);
505     LCD_WRITE_DATA(0x01);
506     LCD_WRITE_DATA(0x30);
507     LCD_WRITE_DATA(0x07);
508     LCD_WRITE_COMMAND(0x26);
509     LCD_WRITE_DATA(0x01);
510     LCD_WRITE_COMMAND(0xE0);
511     LCD_WRITE_DATA(0x0F);
512     LCD_WRITE_DATA(0x30);
513     LCD_WRITE_DATA(0x24);
514     LCD_WRITE_DATA(0x08);
515     LCD_WRITE_DATA(0x07);
516     LCD_WRITE_DATA(0x03);
517     LCD_WRITE_DATA(0x51);
518     LCD_WRITE_DATA(0x50);
519     LCD_WRITE_DATA(0x45);
520     LCD_WRITE_DATA(0x0a);
521     LCD_WRITE_DATA(0x15);
522     LCD_WRITE_DATA(0x04);
523     LCD_WRITE_DATA(0x10);
524     LCD_WRITE_DATA(0x40);
525     LCD_WRITE_DATA(0x00);
526     LCD_WRITE_COMMAND(0xE1);
527     LCD_WRITE_DATA(0x00);
528     LCD_WRITE_DATA(0x15);
529     LCD_WRITE_DATA(0x0a);
530     LCD_WRITE_DATA(0x12);
531     LCD_WRITE_DATA(0x07);
532     LCD_WRITE_DATA(0x13);
533     LCD_WRITE_DATA(0x21);
534     LCD_WRITE_DATA(0x22);
535     LCD_WRITE_DATA(0x38);
536     LCD_WRITE_DATA(0x32);
537     LCD_WRITE_DATA(0x06);
538     LCD_WRITE_DATA(0x03);
539     LCD_WRITE_DATA(0x20);
540     LCD_WRITE_DATA(0x2c);
541     LCD_WRITE_DATA(0x34);
542     LCD_WRITE_COMMAND(0x36);
543     LCD_WRITE_DATA(0x08);
544     LCD_WRITE_COMMAND(0x11);
545     sunxi_lcd_delay_ms(120);
546     LCD_WRITE_COMMAND(0x29);
547     /*Display on*/
548     LCD_WRITE_COMMAND(0x2C);
549 }
550 
lcd_user_defined_func(u32 sel,u32 para1,u32 para2,u32 para3)551 static s32 lcd_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
552 {
553     return 0;
554 }
555 
556 struct __lcd_panel ili9341_panel = {
557     /* panel driver name, must mach the name of lcd_drv_name in sys_config.fex
558        */
559     .name = "ili9341",
560     .func = {
561         .cfg_panel_info = lcd_cfg_panel_info,
562         .cfg_open_flow = lcd_open_flow,
563         .cfg_close_flow = lcd_close_flow,
564         .lcd_user_defined_func = lcd_user_defined_func,
565         },
566 };
567