1 #include <stdio.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <hal_clk.h>
6 #include <hal_gpio.h>
7 #include "disp_sys_intf.h"
8 #include "disp_board_config.h"
9 
10 #include <rtthread.h>
11 
12 #include "lcd_cfg.h"
13 
14 struct property_t *g_lcd0_config = NULL;
15 static struct lcd_cfg_panel_info _panel_info = DEFAULT_LCD_CONFIG;
16 
17 struct property_t g_lcd0_config_rgb[] = {
18     {
19         .name = "lcd_used",
20         .type = PROPERTY_INTGER,
21         .v.value = 1,
22     },
23     {
24         .name = "lcd_driver_name",
25         .type = PROPERTY_STRING,
26         .v.str = "default_lcd",
27     },
28     {
29         .name = "lcd_if",
30         .type = PROPERTY_INTGER,
31         .v.value = 0, /* LCD_IF_HV */
32     },
33     {
34         .name = "lcd_hv_if",
35         .type = PROPERTY_INTGER,
36         .v.value = 0, /* LCD_HV_IF_PRGB_1CYC */
37     },
38     {
39         .name = "lcd_x",
40         .type = PROPERTY_INTGER,
41         .v.value = 480, //
42     },
43     {
44         .name = "lcd_y",
45         .type = PROPERTY_INTGER,
46         .v.value = 272,
47     },
48     {
49         .name = "lcd_width",
50         .type = PROPERTY_INTGER,
51         .v.value = 80,
52     },
53     {
54         .name = "lcd_height",
55         .type = PROPERTY_INTGER,
56         .v.value = 47,
57     },
58     {
59         .name = "lcd_dclk_freq",
60         .type = PROPERTY_INTGER,
61         .v.value = 10,
62     },
63     /* lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp */
64     {
65         .name = "lcd_ht",
66         .type = PROPERTY_INTGER,
67         .v.value = 592,
68     },
69     {
70         .name = "lcd_hbp",
71         .type = PROPERTY_INTGER,
72         .v.value = 56,
73     },
74     {
75         .name = "lcd_hspw",
76         .type = PROPERTY_INTGER,
77         .v.value = 40,
78     },
79     /* lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp */
80     {
81         .name = "lcd_vt",
82         .type = PROPERTY_INTGER,
83         .v.value = 286,
84     },
85     {
86         .name = "lcd_vspw",
87         .type = PROPERTY_INTGER,
88         .v.value = 5,
89     },
90     {
91         .name = "lcd_vbp",
92         .type = PROPERTY_INTGER,
93         .v.value = 6,
94     },
95     {
96         .name = "lcd_frm",
97         .type = PROPERTY_INTGER,
98         .v.value = 1,
99     },
100     {
101         .name = "lcd_io_phase",
102         .type = PROPERTY_INTGER,
103         .v.value = 0,
104     },
105     {
106         .name = "lcd_gamma_en",
107         .type = PROPERTY_INTGER,
108         .v.value = 0,
109     },
110     {
111         .name = "lcd_bright_curve_en",
112         .type = PROPERTY_INTGER,
113         .v.value = 0,
114     },
115     {
116         .name = "lcd_cmap_en",
117         .type = PROPERTY_INTGER,
118         .v.value = 0,
119     },
120     {
121         .name = "deu_mode",
122         .type = PROPERTY_INTGER,
123         .v.value = 0,
124     },
125     {
126         .name = "lcdgamma4iep",
127         .type = PROPERTY_INTGER,
128         .v.value = 22,
129     },
130     {
131         .name = "smart_color",
132         .type = PROPERTY_INTGER,
133         .v.value = 90,
134     },
135 
136     // backlight enable
137     {
138         .name = "lcd_gpio_1",
139         .type = PROPERTY_GPIO,
140         .v.gpio_list = {
141             .gpio = GPIOG(13),
142             .mul_sel = GPIO_DIRECTION_OUTPUT,
143             .pull = 0,
144             .drv_level = 3,
145             .data = 1,
146         },
147     },
148     {
149         .name = "lcd_backlight",
150         .type = PROPERTY_INTGER,
151         .v.value = 50,
152     },
153     {
154         .name = "lcd_pwm_used",
155         .type = PROPERTY_INTGER,
156         .v.value = 1,
157     },
158     {
159         .name = "lcd_pwm_ch",
160         .type = PROPERTY_INTGER,
161         .v.value = 1,
162     },
163     {
164         .name = "lcd_pwm_freq",
165         .type = PROPERTY_INTGER,
166         .v.value = 1000,
167     },
168     {
169         .name = "lcd_pwm_pol",
170         .type = PROPERTY_INTGER,
171         .v.value = 1,
172     },
173     {
174         .name = "lcd_pwm_max_limit",
175         .type = PROPERTY_INTGER,
176         .v.value = 255,
177     },
178     /* POWER-vcc */
179     {
180         .name = "lcd_gpio_0",
181         .type = PROPERTY_GPIO,
182         .v.gpio_list = {
183             .gpio = GPIOG(15),
184             .mul_sel = GPIO_DIRECTION_OUTPUT,
185             .pull = 0,
186             .drv_level = 3,
187             .data = 1,
188         },
189     },
190     // gpio
191     {
192         .name = "LCD0_D2",
193         .type = PROPERTY_PIN,
194         .v.gpio_list = {
195             .gpio = GPIOD(0),
196             .mul_sel = 2,
197             .pull = 0,
198             .drv_level = 3,
199         },
200     },
201     {
202         .name = "LCD0_D3",
203         .type = PROPERTY_PIN,
204         .v.gpio_list = {
205             .gpio = GPIOD(1),
206             .mul_sel = 2,
207             .pull = 0,
208             .drv_level = 3,
209         },
210     },
211     {
212         .name = "LCD0_D4",
213         .type = PROPERTY_PIN,
214         .v.gpio_list = {
215             .gpio = GPIOD(2),
216             .mul_sel = 2,
217             .pull = 0,
218             .drv_level = 3,
219         },
220     },
221     {
222         .name = "LCD0_D5",
223         .type = PROPERTY_PIN,
224         .v.gpio_list = {
225             .gpio = GPIOD(3),
226             .mul_sel = 2,
227             .pull = 0,
228             .drv_level = 3,
229         },
230     },
231     {
232         .name = "LCD0_D6",
233         .type = PROPERTY_PIN,
234         .v.gpio_list = {
235             .gpio = GPIOD(4),
236             .mul_sel = 2,
237             .pull = 0,
238             .drv_level = 3,
239         },
240     },
241     {
242         .name = "LCD0_D7",
243         .type = PROPERTY_PIN,
244         .v.gpio_list = {
245             .gpio = GPIOD(5),
246             .mul_sel = 2,
247             .pull = 0,
248             .drv_level = 3,
249         },
250     },
251     {
252         .name = "LCD0_D10",
253         .type = PROPERTY_PIN,
254         .v.gpio_list = {
255             .gpio = GPIOD(6),
256             .mul_sel = 2,
257             .pull = 0,
258             .drv_level = 3,
259         },
260     },
261     {
262         .name = "LCD0_D11",
263         .type = PROPERTY_PIN,
264         .v.gpio_list = {
265             .gpio = GPIOD(7),
266             .mul_sel = 2,
267             .pull = 0,
268             .drv_level = 3,
269         },
270     },
271     {
272         .name = "LCD0_D12",
273         .type = PROPERTY_PIN,
274         .v.gpio_list = {
275             .gpio = GPIOD(8),
276             .mul_sel = 2,
277             .pull = 0,
278             .drv_level = 3,
279         },
280     },
281     {
282         .name = "LCD0_D13",
283         .type = PROPERTY_PIN,
284         .v.gpio_list = {
285             .gpio = GPIOD(9),
286             .mul_sel = 2,
287             .pull = 0,
288             .drv_level = 3,
289         },
290     },
291     {
292         .name = "LCD0_D14",
293         .type = PROPERTY_PIN,
294         .v.gpio_list = {
295             .gpio = GPIOD(10),
296             .mul_sel = 2,
297             .pull = 0,
298             .drv_level = 3,
299         },
300     },
301     {
302         .name = "LCD0_D15",
303         .type = PROPERTY_PIN,
304         .v.gpio_list = {
305             .gpio = GPIOD(11),
306             .mul_sel = 2,
307             .pull = 0,
308             .drv_level = 3,
309         },
310     },
311     {
312         .name = "LCD0_D18",
313         .type = PROPERTY_PIN,
314         .v.gpio_list = {
315             .gpio = GPIOD(12),
316             .mul_sel = 2,
317             .pull = 0,
318             .drv_level = 3,
319         },
320     },
321     {
322         .name = "LCD0_D19",
323         .type = PROPERTY_PIN,
324         .v.gpio_list = {
325             .gpio = GPIOD(13),
326             .mul_sel = 2,
327             .pull = 0,
328             .drv_level = 3,
329         },
330     },
331     {
332         .name = "LCD0_D20",
333         .type = PROPERTY_PIN,
334         .v.gpio_list = {
335             .gpio = GPIOD(14),
336             .mul_sel = 2,
337             .pull = 0,
338             .drv_level = 3,
339         },
340     },
341     {
342         .name = "LCD0_D21",
343         .type = PROPERTY_PIN,
344         .v.gpio_list = {
345             .gpio = GPIOD(15),
346             .mul_sel = 2,
347             .pull = 0,
348             .drv_level = 3,
349         },
350     },
351     {
352         .name = "LCD0_D22",
353         .type = PROPERTY_PIN,
354         .v.gpio_list = {
355             .gpio = GPIOD(16),
356             .mul_sel = 2,
357             .pull = 0,
358             .drv_level = 3,
359         },
360     },
361     {
362         .name = "LCD0_D23",
363         .type = PROPERTY_PIN,
364         .v.gpio_list = {
365             .gpio = GPIOD(17),
366             .mul_sel = 2,
367             .pull = 0,
368             .drv_level = 3,
369         },
370     },
371     {
372         .name = "LCD0_CLK",
373         .type = PROPERTY_PIN,
374         .v.gpio_list = {
375             .gpio = GPIOD(18),
376             .mul_sel = 2,
377             .pull = 0,
378             .drv_level = 3,
379         },
380     },
381     {
382         .name = "LCD0_DE",
383         .type = PROPERTY_PIN,
384         .v.gpio_list = {
385             .gpio = GPIOD(19),
386             .mul_sel = 2,
387             .pull = 0,
388             .drv_level = 3,
389         },
390     },
391     {
392         .name = "LCD0_HSYNC",
393         .type = PROPERTY_PIN,
394         .v.gpio_list = {
395             .gpio = GPIOD(20),
396             .mul_sel = 2,
397             .pull = 0,
398             .drv_level = 3,
399         },
400     },
401     {
402         .name = "LCD0_VSYNC",
403         .type = PROPERTY_PIN,
404         .v.gpio_list = {
405             .gpio = GPIOD(21),
406             .mul_sel = 2,
407             .pull = 0,
408             .drv_level = 3,
409         },
410     }};
411 
412 struct property_t g_lcd0_config_mipi[] = {
413     {
414         .name = "lcd_used",
415         .type = PROPERTY_INTGER,
416         .v.value = 1,
417     },
418     {
419         .name = "lcd_driver_name",
420         .type = PROPERTY_STRING,
421         .v.str = "tft08006",
422     },
423     {
424         .name = "lcd_backlight",
425         .type = PROPERTY_INTGER,
426         .v.value = 50,
427     },
428     {
429         .name = "lcd_if",
430         .type = PROPERTY_INTGER,
431         .v.value = LCD_IF_DSI,
432     },
433     {
434         .name = "lcd_x",
435         .type = PROPERTY_INTGER,
436         .v.value = 540,
437     },
438     {
439         .name = "lcd_y",
440         .type = PROPERTY_INTGER,
441         .v.value = 960, // 1280
442     },
443     {
444         .name = "lcd_width",
445         .type = PROPERTY_INTGER,
446         .v.value = 52,
447     },
448     {
449         .name = "lcd_height",
450         .type = PROPERTY_INTGER,
451         .v.value = 52,
452     },
453     {
454         .name = "lcd_dclk_freq",
455         .type = PROPERTY_INTGER,
456         .v.value = 43,
457     },
458     {
459         .name = "lcd_pwm_used",
460         .type = PROPERTY_INTGER,
461         .v.value = 1,
462     },
463     {
464         .name = "lcd_pwm_ch",
465         .type = PROPERTY_INTGER,
466         .v.value = 1,
467     },
468     {
469         .name = "lcd_pwm_freq",
470         .type = PROPERTY_INTGER,
471         .v.value = 50000,
472     },
473     {
474         .name = "lcd_pwm_pol",
475         .type = PROPERTY_INTGER,
476         .v.value = 1,
477     },
478     {
479         .name = "lcd_pwm_max_limit",
480         .type = PROPERTY_INTGER,
481         .v.value = 255,
482     },
483     {
484         .name = "lcd_hbp",
485         .type = PROPERTY_INTGER,
486         .v.value = 88,
487     },
488     {
489         .name = "lcd_ht",
490         .type = PROPERTY_INTGER,
491         .v.value = 721,
492     },
493     {
494         .name = "lcd_hspw",
495         .type = PROPERTY_INTGER,
496         .v.value = 56,
497     },
498     {
499         .name = "lcd_vbp",
500         .type = PROPERTY_INTGER,
501         .v.value = 23,
502     },
503     {
504         .name = "lcd_vt",
505         .type = PROPERTY_INTGER,
506         .v.value = 996,
507     },
508     {
509         .name = "lcd_vspw",
510         .type = PROPERTY_INTGER,
511         .v.value = 10,
512     },
513     {
514         .name = "lcd_frm",
515         .type = PROPERTY_INTGER,
516         .v.value = 0,
517     },
518     {
519         .name = "lcd_io_phase",
520         .type = PROPERTY_INTGER,
521         .v.value = 0,
522     },
523     {
524         .name = "lcd_gamma_en",
525         .type = PROPERTY_INTGER,
526         .v.value = 0,
527     },
528     {
529         .name = "lcd_bright_curve_en",
530         .type = PROPERTY_INTGER,
531         .v.value = 0,
532     },
533     {
534         .name = "lcd_cmap_en",
535         .type = PROPERTY_INTGER,
536         .v.value = 0,
537     },
538     {
539         .name = "deu_mode",
540         .type = PROPERTY_INTGER,
541         .v.value = 0,
542     },
543     {
544         .name = "lcdgamma4iep",
545         .type = PROPERTY_INTGER,
546         .v.value = 22,
547     },
548     {
549         .name = "smart_color",
550         .type = PROPERTY_INTGER,
551         .v.value = 90,
552     },
553     {
554         .name = "lcd_dsi_if",
555         .type = PROPERTY_INTGER,
556         .v.value = 0,
557     },
558     {
559         .name = "lcd_dsi_lane",
560         .type = PROPERTY_INTGER,
561         .v.value = 2,
562     },
563     {
564         .name = "lcd_dsi_format",
565         .type = PROPERTY_INTGER,
566         .v.value = 0,
567     },
568     {
569         .name = "lcd_dsi_te",
570         .type = PROPERTY_INTGER,
571         .v.value = 0,
572     },
573     {
574         .name = "lcd_fsync_act_time",
575         .type = PROPERTY_INTGER,
576         .v.value = 1000,
577     },
578     {
579         .name = "lcd_fsync_dis_time",
580         .type = PROPERTY_INTGER,
581         .v.value = 1000,
582     },
583 
584     // backlight enable
585     /*
586     {
587         .name = "lcd_gpio_1",
588         .type = PROPERTY_GPIO,
589         .v.gpio_list = {
590             .gpio = GPIOE(11),
591             .mul_sel = GPIO_DIRECTION_OUTPUT,
592             .pull = 0,
593             .drv_level = 3,
594             .data = 1,
595         },
596     },
597     */
598     /* DSI reset */
599     // {
600     //  .name = "lcd_gpio_0",
601     //  .type = PROPERTY_GPIO,
602     //  .v.gpio_list = {
603     //      .gpio = GPIOG(13),
604     //      .mul_sel = GPIO_DIRECTION_OUTPUT,
605     //      .pull = 0,
606     //      .drv_level = 3,
607     //      .data = 1,
608     //  },
609     // },
610     // gpio
611     {
612         .name = "LCD0_D0",
613         .type = PROPERTY_PIN,
614         .v.gpio_list = {
615             .gpio = GPIOD(0),
616             .mul_sel = 4,
617             .pull = 0,
618             .drv_level = 3,
619         },
620     },
621     {
622         .name = "LCD0_D1",
623         .type = PROPERTY_PIN,
624         .v.gpio_list = {
625             .gpio = GPIOD(1),
626             .mul_sel = 4,
627             .pull = 0,
628             .drv_level = 3,
629         },
630     },
631     {
632         .name = "LCD0_D2",
633         .type = PROPERTY_PIN,
634         .v.gpio_list = {
635             .gpio = GPIOD(2),
636             .mul_sel = 4,
637             .pull = 0,
638             .drv_level = 3,
639         },
640     },
641     {
642         .name = "LCD0_D3",
643         .type = PROPERTY_PIN,
644         .v.gpio_list = {
645             .gpio = GPIOD(3),
646             .mul_sel = 4,
647             .pull = 0,
648             .drv_level = 3,
649         },
650     },
651     {
652         .name = "LCD0_D4",
653         .type = PROPERTY_PIN,
654         .v.gpio_list = {
655             .gpio = GPIOD(4),
656             .mul_sel = 4,
657             .pull = 0,
658             .drv_level = 3,
659         },
660     },
661     {
662         .name = "LCD0_D5",
663         .type = PROPERTY_PIN,
664         .v.gpio_list = {
665             .gpio = GPIOD(5),
666             .mul_sel = 4,
667             .pull = 0,
668             .drv_level = 3,
669         },
670     },
671     {
672         .name = "LCD0_D6",
673         .type = PROPERTY_PIN,
674         .v.gpio_list = {
675             .gpio = GPIOD(6),
676             .mul_sel = 4,
677             .pull = 0,
678             .drv_level = 3,
679         },
680     },
681     {
682         .name = "LCD0_D7",
683         .type = PROPERTY_PIN,
684         .v.gpio_list = {
685             .gpio = GPIOD(7),
686             .mul_sel = 4,
687             .pull = 0,
688             .drv_level = 3,
689         },
690     },
691     {
692         .name = "LCD0_D8",
693         .type = PROPERTY_PIN,
694         .v.gpio_list = {
695             .gpio = GPIOD(8),
696             .mul_sel = 4,
697             .pull = 0,
698             .drv_level = 3,
699         },
700     },
701     {
702         .name = "LCD0_D9",
703         .type = PROPERTY_PIN,
704         .v.gpio_list = {
705             .gpio = GPIOD(9),
706             .mul_sel = 4,
707             .pull = 0,
708             .drv_level = 3,
709         },
710     },
711 };
712 
713 struct property_t g_lcd0_config_lvds[] = {
714     {
715         .name = "lcd_used",
716         .type = PROPERTY_INTGER,
717         .v.value = 1,
718     },
719     {
720         .name = "lcd_driver_name",
721         .type = PROPERTY_STRING,
722         .v.str = "default_lcd",
723     },
724     {
725         .name = "lcd_backlight",
726         .type = PROPERTY_INTGER,
727         .v.value = 150,
728     },
729     {
730         .name = "lcd_if",
731         .type = PROPERTY_INTGER,
732         .v.value = LCD_IF_LVDS,
733     },
734     {
735         .name = "lcd_x",
736         .type = PROPERTY_INTGER,
737         .v.value = 1920,
738     },
739     {
740         .name = "lcd_y",
741         .type = PROPERTY_INTGER,
742         .v.value = 1080,
743     },
744     {
745         .name = "lcd_width",
746         .type = PROPERTY_INTGER,
747         .v.value = 150,
748     },
749     {
750         .name = "lcd_height",
751         .type = PROPERTY_INTGER,
752         .v.value = 94,
753     },
754     {
755         .name = "lcd_dclk_freq",
756         .type = PROPERTY_INTGER,
757         .v.value = 71 * 2, // dual lvds, freq=single*2.
758     },
759     {
760         .name = "lcd_rb_swap",
761         .type = PROPERTY_INTGER,
762         .v.value = 0,
763     },
764     {
765         .name = "lcd_pwm_used",
766         .type = PROPERTY_INTGER,
767         .v.value = 0,
768     },
769     {
770         .name = "lcd_pwm_ch",
771         .type = PROPERTY_INTGER,
772         .v.value = 7,
773     },
774     {
775         .name = "lcd_pwm_freq",
776         .type = PROPERTY_INTGER,
777         .v.value = 50000,
778     },
779     {
780         .name = "lcd_pwm_pol",
781         .type = PROPERTY_INTGER,
782         .v.value = 1,
783     },
784     {
785         .name = "lcd_pwm_max_limit",
786         .type = PROPERTY_INTGER,
787         .v.value = 255,
788     },
789     {
790         .name = "lcd_hbp",
791         .type = PROPERTY_INTGER,
792         .v.value = 90, // P19: Tblk(h) period 74-90-140
793     },
794     {
795         .name = "lcd_ht",
796         .type = PROPERTY_INTGER,
797         .v.value = (960 + 90) * 2, // x+hbp P19: Th period 1034-1050-1100
798     },
799     {
800         .name = "lcd_hspw",
801         .type = PROPERTY_INTGER,
802         .v.value = 10,
803     },
804     {
805         .name = "lcd_vbp",
806         .type = PROPERTY_INTGER,
807         .v.value = 50, // P19: Tblk(v) period 12-50-738
808     },
809     {
810         .name = "lcd_vt",
811         .type = PROPERTY_INTGER,
812         .v.value = (1080 + 50) + 50, // y+vbp P19: Tv period 1092-1130-1818
813     },
814     {
815         .name = "lcd_vspw",
816         .type = PROPERTY_INTGER,
817         .v.value = 5,
818     },
819     {
820         .name = "lcd_lvds_if",
821         .type = PROPERTY_INTGER,
822         .v.value = LCD_LVDS_IF_DUAL_LINK,
823     },
824     {
825         .name = "lcd_lvds_colordepth",
826         .type = PROPERTY_INTGER,
827         .v.value = LCD_LVDS_8bit,
828     },
829     {
830         .name = "lcd_lvds_mode",
831         .type = PROPERTY_INTGER,
832         .v.value = LCD_LVDS_MODE_NS,
833     },
834     {
835         .name = "lcd_frm",
836         .type = PROPERTY_INTGER,
837         .v.value = 1,
838     },
839     {
840         .name = "lcd_io_phase",
841         .type = PROPERTY_INTGER,
842         .v.value = 0,
843     },
844     {
845         .name = "lcd_hv_clk_phase",
846         .type = PROPERTY_INTGER,
847         .v.value = 0,
848     },
849     {
850         .name = "lcd_hv_sync_polarity",
851         .type = PROPERTY_INTGER,
852         .v.value = 0,
853     },
854     {
855         .name = "lcd_gamma_en",
856         .type = PROPERTY_INTGER,
857         .v.value = 0,
858     },
859     {
860         .name = "lcd_bright_curve_en",
861         .type = PROPERTY_INTGER,
862         .v.value = 0,
863     },
864     {
865         .name = "lcd_cmap_en",
866         .type = PROPERTY_INTGER,
867         .v.value = 0,
868     },
869     {
870         .name = "deu_mode",
871         .type = PROPERTY_INTGER,
872         .v.value = 0,
873     },
874     {
875         .name = "lcdgamma4iep",
876         .type = PROPERTY_INTGER,
877         .v.value = 22,
878     },
879     {
880         .name = "smart_color",
881         .type = PROPERTY_INTGER,
882         .v.value = 90,
883     },
884 
885     // gpio
886     {
887         .name = "LCD0_D0",
888         .type = PROPERTY_PIN,
889         .v.gpio_list = {
890             .gpio = GPIOD(0),
891             .mul_sel = 3,
892             .pull = 0,
893             .drv_level = 3,
894         },
895     },
896     {
897         .name = "LCD0_D1",
898         .type = PROPERTY_PIN,
899         .v.gpio_list = {
900             .gpio = GPIOD(1),
901             .mul_sel = 3,
902             .pull = 0,
903             .drv_level = 3,
904         },
905     },
906     {
907         .name = "LCD0_D2",
908         .type = PROPERTY_PIN,
909         .v.gpio_list = {
910             .gpio = GPIOD(2),
911             .mul_sel = 3,
912             .pull = 0,
913             .drv_level = 3,
914         },
915     },
916     {
917         .name = "LCD0_D3",
918         .type = PROPERTY_PIN,
919         .v.gpio_list = {
920             .gpio = GPIOD(3),
921             .mul_sel = 3,
922             .pull = 0,
923             .drv_level = 3,
924         },
925     },
926     {
927         .name = "LCD0_D4",
928         .type = PROPERTY_PIN,
929         .v.gpio_list = {
930             .gpio = GPIOD(4),
931             .mul_sel = 3,
932             .pull = 0,
933             .drv_level = 3,
934         },
935     },
936     {
937         .name = "LCD0_D5",
938         .type = PROPERTY_PIN,
939         .v.gpio_list = {
940             .gpio = GPIOD(5),
941             .mul_sel = 3,
942             .pull = 0,
943             .drv_level = 3,
944         },
945     },
946     {
947         .name = "LCD0_D6",
948         .type = PROPERTY_PIN,
949         .v.gpio_list = {
950             .gpio = GPIOD(6),
951             .mul_sel = 3,
952             .pull = 0,
953             .drv_level = 3,
954         },
955     },
956     {
957         .name = "LCD0_D7",
958         .type = PROPERTY_PIN,
959         .v.gpio_list = {
960             .gpio = GPIOD(7),
961             .mul_sel = 3,
962             .pull = 0,
963             .drv_level = 3,
964         },
965     },
966     {
967         .name = "LCD0_D8",
968         .type = PROPERTY_PIN,
969         .v.gpio_list = {
970             .gpio = GPIOD(8),
971             .mul_sel = 3,
972             .pull = 0,
973             .drv_level = 3,
974         },
975     },
976     {
977         .name = "LCD0_D9",
978         .type = PROPERTY_PIN,
979         .v.gpio_list = {
980             .gpio = GPIOD(9),
981             .mul_sel = 3,
982             .pull = 0,
983             .drv_level = 3,
984         },
985     },
986 #if 1
987     {
988         .name = "LCD0_D14",
989         .type = PROPERTY_PIN,
990         .v.gpio_list = {
991             .gpio = GPIOD(10),
992             .mul_sel = 3,
993             .pull = 0,
994             .drv_level = 3,
995         },
996     },
997     {
998         .name = "LCD0_D15",
999         .type = PROPERTY_PIN,
1000         .v.gpio_list = {
1001             .gpio = GPIOD(11),
1002             .mul_sel = 3,
1003             .pull = 0,
1004             .drv_level = 3,
1005         },
1006     },
1007     {
1008         .name = "LCD0_D18",
1009         .type = PROPERTY_PIN,
1010         .v.gpio_list = {
1011             .gpio = GPIOD(12),
1012             .mul_sel = 3,
1013             .pull = 0,
1014             .drv_level = 3,
1015         },
1016     },
1017     {
1018         .name = "LCD0_D19",
1019         .type = PROPERTY_PIN,
1020         .v.gpio_list = {
1021             .gpio = GPIOD(13),
1022             .mul_sel = 3,
1023             .pull = 0,
1024             .drv_level = 3,
1025         },
1026     },
1027     {
1028         .name = "LCD0_D20",
1029         .type = PROPERTY_PIN,
1030         .v.gpio_list = {
1031             .gpio = GPIOD(14),
1032             .mul_sel = 3,
1033             .pull = 0,
1034             .drv_level = 3,
1035         },
1036     },
1037     {
1038         .name = "LCD0_D21",
1039         .type = PROPERTY_PIN,
1040         .v.gpio_list = {
1041             .gpio = GPIOD(15),
1042             .mul_sel = 3,
1043             .pull = 0,
1044             .drv_level = 3,
1045         },
1046     },
1047     {
1048         .name = "LCD0_D22",
1049         .type = PROPERTY_PIN,
1050         .v.gpio_list = {
1051             .gpio = GPIOD(16),
1052             .mul_sel = 3,
1053             .pull = 0,
1054             .drv_level = 3,
1055         },
1056     },
1057     {
1058         .name = "LCD0_D23",
1059         .type = PROPERTY_PIN,
1060         .v.gpio_list = {
1061             .gpio = GPIOD(17),
1062             .mul_sel = 3,
1063             .pull = 0,
1064             .drv_level = 3,
1065         },
1066     },
1067     {
1068         .name = "LCD0_CLK",
1069         .type = PROPERTY_PIN,
1070         .v.gpio_list = {
1071             .gpio = GPIOD(18),
1072             .mul_sel = 3,
1073             .pull = 0,
1074             .drv_level = 3,
1075         },
1076     },
1077     {
1078         .name = "LCD0_DE",
1079         .type = PROPERTY_PIN,
1080         .v.gpio_list = {
1081             .gpio = GPIOD(19),
1082             .mul_sel = 3,
1083             .pull = 0,
1084             .drv_level = 3,
1085         },
1086     },
1087 #endif
1088 
1089 };
1090 
1091 struct property_t g_lcd1_config[] = {
1092     {
1093         .name = "lcd_used",
1094         .type = PROPERTY_INTGER,
1095         .v.value = 0,
1096     },
1097 };
1098 
1099 struct property_t g_disp_config[] = {
1100     {
1101         .name = "disp_init_enable",
1102         .type = PROPERTY_INTGER,
1103         .v.value = 1,
1104     },
1105     {
1106         .name = "disp_mode",
1107         .type = PROPERTY_INTGER,
1108         .v.value = 0, /* DISP_INIT_MODE_SCREEN0 */
1109     },
1110     {
1111         .name = "screen0_output_type",
1112         .type = PROPERTY_INTGER,
1113         .v.value = 1, /* DISP_OUTPUT_TYPE_LCD */
1114     },
1115     {
1116         .name = "screen0_output_mode",
1117         .type = PROPERTY_INTGER,
1118         .v.value = 4,
1119     },
1120     {
1121         .name = "screen0_output_format",
1122         .type = PROPERTY_INTGER,
1123         .v.value = 1,
1124     },
1125     {
1126         .name = "screen0_output_bits",
1127         .type = PROPERTY_INTGER,
1128         .v.value = 0,
1129     },
1130     {
1131         .name = "screen0_output_eotf",
1132         .type = PROPERTY_INTGER,
1133         .v.value = 4,
1134     },
1135     {
1136         .name = "screen0_output_cs",
1137         .type = PROPERTY_INTGER,
1138         .v.value = 257,
1139     },
1140     {
1141         .name = "screen0_output_dvi_hdmi",
1142         .type = PROPERTY_INTGER,
1143         .v.value = 2,
1144     },
1145     {
1146         .name = "screen0_output_range",
1147         .type = PROPERTY_INTGER,
1148         .v.value = 2,
1149     },
1150     {
1151         .name = "screen0_output_scan",
1152         .type = PROPERTY_INTGER,
1153         .v.value = 0,
1154     },
1155     {
1156         .name = "screen0_output_aspect_ratio",
1157         .type = PROPERTY_INTGER,
1158         .v.value = 8,
1159     },
1160 };
1161 
1162 u32 g_lcd0_config_len = sizeof(g_lcd0_config_rgb) / sizeof(struct property_t);
1163 u32 g_lcd1_config_len = sizeof(g_lcd1_config) / sizeof(struct property_t);
1164 u32 g_disp_config_len = sizeof(g_disp_config) / sizeof(struct property_t);
1165 
_lcd_property_find(const char * name,struct property_t * _config,const u32 config_len)1166 static struct property_t *_lcd_property_find(const char *name, struct property_t *_config, const u32 config_len)
1167 {
1168     u32 i;
1169 
1170     for (i = 0; i < config_len; i++)
1171     {
1172         if (_config[i].type != PROPERTY_INTGER)
1173         {
1174             continue;
1175         }
1176 
1177         if (!strcmp(name, _config[i].name))
1178         {
1179             return _config + i;
1180         }
1181     }
1182 
1183     return NULL;
1184 }
1185 
1186 #ifndef LCD_XML_CONFIG_FILE
1187 #define LCD_CONFIG_FILE "/etc/lcd_config.xml"
1188 #else
1189 #define LCD_CONFIG_FILE LCD_XML_CONFIG_FILE
1190 #endif
load_lcd_config_from_xml(void)1191 const struct lcd_cfg_panel_info *load_lcd_config_from_xml(void)
1192 {
1193     struct property_t *_config_item;
1194     static rt_uint8_t init_state = 0;
1195 
1196     rt_enter_critical();
1197     if (init_state == 0)
1198     {
1199         init_state = 1;
1200         rt_exit_critical();
1201     }
1202     else
1203     {
1204         rt_exit_critical();
1205 
1206         while (init_state != 2)
1207         {
1208             rt_thread_mdelay(10);
1209         }
1210         goto _RET;
1211     }
1212 
1213     g_lcd0_config = g_lcd0_config_rgb;
1214     g_lcd0_config_len = sizeof(g_lcd0_config_rgb) / sizeof(struct property_t);
1215 _RET:
1216 
1217     init_state = 2;
1218     _config_item = _lcd_property_find("lcd_x", g_lcd0_config, g_lcd0_config_len);
1219     _panel_info.width = _config_item->v.value;
1220     _config_item = _lcd_property_find("lcd_y", g_lcd0_config, g_lcd0_config_len);
1221     _panel_info.height = _config_item->v.value;
1222 
1223     return &_panel_info;
1224 }
1225