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