#include #include #include #include #include #include #include "disp_sys_intf.h" #include "disp_board_config.h" #include #include "lcd_cfg.h" struct property_t *g_lcd0_config = NULL; static struct lcd_cfg_panel_info _panel_info = DEFAULT_LCD_CONFIG; struct property_t g_lcd0_config_rgb[] = { { .name = "lcd_used", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_driver_name", .type = PROPERTY_STRING, .v.str = "default_lcd", }, { .name = "lcd_if", .type = PROPERTY_INTGER, .v.value = 0, /* LCD_IF_HV */ }, { .name = "lcd_hv_if", .type = PROPERTY_INTGER, .v.value = 0, /* LCD_HV_IF_PRGB_1CYC */ }, { .name = "lcd_x", .type = PROPERTY_INTGER, .v.value = 480, // }, { .name = "lcd_y", .type = PROPERTY_INTGER, .v.value = 272, }, { .name = "lcd_width", .type = PROPERTY_INTGER, .v.value = 80, }, { .name = "lcd_height", .type = PROPERTY_INTGER, .v.value = 47, }, { .name = "lcd_dclk_freq", .type = PROPERTY_INTGER, .v.value = 10, }, /* lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp */ { .name = "lcd_ht", .type = PROPERTY_INTGER, .v.value = 592, }, { .name = "lcd_hbp", .type = PROPERTY_INTGER, .v.value = 56, }, { .name = "lcd_hspw", .type = PROPERTY_INTGER, .v.value = 40, }, /* lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp */ { .name = "lcd_vt", .type = PROPERTY_INTGER, .v.value = 286, }, { .name = "lcd_vspw", .type = PROPERTY_INTGER, .v.value = 5, }, { .name = "lcd_vbp", .type = PROPERTY_INTGER, .v.value = 6, }, { .name = "lcd_frm", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_io_phase", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_gamma_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_bright_curve_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_cmap_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "deu_mode", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcdgamma4iep", .type = PROPERTY_INTGER, .v.value = 22, }, { .name = "smart_color", .type = PROPERTY_INTGER, .v.value = 90, }, // backlight enable { .name = "lcd_gpio_1", .type = PROPERTY_GPIO, .v.gpio_list = { .gpio = GPIOG(13), .mul_sel = GPIO_DIRECTION_OUTPUT, .pull = 0, .drv_level = 3, .data = 1, }, }, { .name = "lcd_backlight", .type = PROPERTY_INTGER, .v.value = 50, }, { .name = "lcd_pwm_used", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_ch", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_freq", .type = PROPERTY_INTGER, .v.value = 1000, }, { .name = "lcd_pwm_pol", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_max_limit", .type = PROPERTY_INTGER, .v.value = 255, }, /* POWER-vcc */ { .name = "lcd_gpio_0", .type = PROPERTY_GPIO, .v.gpio_list = { .gpio = GPIOG(15), .mul_sel = GPIO_DIRECTION_OUTPUT, .pull = 0, .drv_level = 3, .data = 1, }, }, // gpio { .name = "LCD0_D2", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(0), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D3", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(1), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D4", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(2), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D5", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(3), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D6", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(4), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D7", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(5), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D10", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(6), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D11", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(7), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D12", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(8), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D13", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(9), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D14", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(10), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D15", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(11), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D18", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(12), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D19", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(13), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D20", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(14), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D21", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(15), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D22", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(16), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D23", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(17), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_CLK", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(18), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_DE", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(19), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_HSYNC", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(20), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_VSYNC", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(21), .mul_sel = 2, .pull = 0, .drv_level = 3, }, }}; struct property_t g_lcd0_config_mipi[] = { { .name = "lcd_used", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_driver_name", .type = PROPERTY_STRING, .v.str = "tft08006", }, { .name = "lcd_backlight", .type = PROPERTY_INTGER, .v.value = 50, }, { .name = "lcd_if", .type = PROPERTY_INTGER, .v.value = LCD_IF_DSI, }, { .name = "lcd_x", .type = PROPERTY_INTGER, .v.value = 540, }, { .name = "lcd_y", .type = PROPERTY_INTGER, .v.value = 960, // 1280 }, { .name = "lcd_width", .type = PROPERTY_INTGER, .v.value = 52, }, { .name = "lcd_height", .type = PROPERTY_INTGER, .v.value = 52, }, { .name = "lcd_dclk_freq", .type = PROPERTY_INTGER, .v.value = 43, }, { .name = "lcd_pwm_used", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_ch", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_freq", .type = PROPERTY_INTGER, .v.value = 50000, }, { .name = "lcd_pwm_pol", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_max_limit", .type = PROPERTY_INTGER, .v.value = 255, }, { .name = "lcd_hbp", .type = PROPERTY_INTGER, .v.value = 88, }, { .name = "lcd_ht", .type = PROPERTY_INTGER, .v.value = 721, }, { .name = "lcd_hspw", .type = PROPERTY_INTGER, .v.value = 56, }, { .name = "lcd_vbp", .type = PROPERTY_INTGER, .v.value = 23, }, { .name = "lcd_vt", .type = PROPERTY_INTGER, .v.value = 996, }, { .name = "lcd_vspw", .type = PROPERTY_INTGER, .v.value = 10, }, { .name = "lcd_frm", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_io_phase", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_gamma_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_bright_curve_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_cmap_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "deu_mode", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcdgamma4iep", .type = PROPERTY_INTGER, .v.value = 22, }, { .name = "smart_color", .type = PROPERTY_INTGER, .v.value = 90, }, { .name = "lcd_dsi_if", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_dsi_lane", .type = PROPERTY_INTGER, .v.value = 2, }, { .name = "lcd_dsi_format", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_dsi_te", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_fsync_act_time", .type = PROPERTY_INTGER, .v.value = 1000, }, { .name = "lcd_fsync_dis_time", .type = PROPERTY_INTGER, .v.value = 1000, }, // backlight enable /* { .name = "lcd_gpio_1", .type = PROPERTY_GPIO, .v.gpio_list = { .gpio = GPIOE(11), .mul_sel = GPIO_DIRECTION_OUTPUT, .pull = 0, .drv_level = 3, .data = 1, }, }, */ /* DSI reset */ // { // .name = "lcd_gpio_0", // .type = PROPERTY_GPIO, // .v.gpio_list = { // .gpio = GPIOG(13), // .mul_sel = GPIO_DIRECTION_OUTPUT, // .pull = 0, // .drv_level = 3, // .data = 1, // }, // }, // gpio { .name = "LCD0_D0", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(0), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D1", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(1), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D2", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(2), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D3", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(3), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D4", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(4), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D5", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(5), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D6", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(6), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D7", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(7), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D8", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(8), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D9", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(9), .mul_sel = 4, .pull = 0, .drv_level = 3, }, }, }; struct property_t g_lcd0_config_lvds[] = { { .name = "lcd_used", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_driver_name", .type = PROPERTY_STRING, .v.str = "default_lcd", }, { .name = "lcd_backlight", .type = PROPERTY_INTGER, .v.value = 150, }, { .name = "lcd_if", .type = PROPERTY_INTGER, .v.value = LCD_IF_LVDS, }, { .name = "lcd_x", .type = PROPERTY_INTGER, .v.value = 1920, }, { .name = "lcd_y", .type = PROPERTY_INTGER, .v.value = 1080, }, { .name = "lcd_width", .type = PROPERTY_INTGER, .v.value = 150, }, { .name = "lcd_height", .type = PROPERTY_INTGER, .v.value = 94, }, { .name = "lcd_dclk_freq", .type = PROPERTY_INTGER, .v.value = 71 * 2, // dual lvds, freq=single*2. }, { .name = "lcd_rb_swap", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_pwm_used", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_pwm_ch", .type = PROPERTY_INTGER, .v.value = 7, }, { .name = "lcd_pwm_freq", .type = PROPERTY_INTGER, .v.value = 50000, }, { .name = "lcd_pwm_pol", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_pwm_max_limit", .type = PROPERTY_INTGER, .v.value = 255, }, { .name = "lcd_hbp", .type = PROPERTY_INTGER, .v.value = 90, // P19: Tblk(h) period 74-90-140 }, { .name = "lcd_ht", .type = PROPERTY_INTGER, .v.value = (960 + 90) * 2, // x+hbp P19: Th period 1034-1050-1100 }, { .name = "lcd_hspw", .type = PROPERTY_INTGER, .v.value = 10, }, { .name = "lcd_vbp", .type = PROPERTY_INTGER, .v.value = 50, // P19: Tblk(v) period 12-50-738 }, { .name = "lcd_vt", .type = PROPERTY_INTGER, .v.value = (1080 + 50) + 50, // y+vbp P19: Tv period 1092-1130-1818 }, { .name = "lcd_vspw", .type = PROPERTY_INTGER, .v.value = 5, }, { .name = "lcd_lvds_if", .type = PROPERTY_INTGER, .v.value = LCD_LVDS_IF_DUAL_LINK, }, { .name = "lcd_lvds_colordepth", .type = PROPERTY_INTGER, .v.value = LCD_LVDS_8bit, }, { .name = "lcd_lvds_mode", .type = PROPERTY_INTGER, .v.value = LCD_LVDS_MODE_NS, }, { .name = "lcd_frm", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "lcd_io_phase", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_hv_clk_phase", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_hv_sync_polarity", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_gamma_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_bright_curve_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcd_cmap_en", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "deu_mode", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "lcdgamma4iep", .type = PROPERTY_INTGER, .v.value = 22, }, { .name = "smart_color", .type = PROPERTY_INTGER, .v.value = 90, }, // gpio { .name = "LCD0_D0", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(0), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D1", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(1), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D2", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(2), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D3", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(3), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D4", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(4), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D5", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(5), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D6", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(6), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D7", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(7), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D8", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(8), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D9", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(9), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, #if 1 { .name = "LCD0_D14", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(10), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D15", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(11), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D18", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(12), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D19", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(13), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D20", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(14), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D21", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(15), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D22", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(16), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_D23", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(17), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_CLK", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(18), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, { .name = "LCD0_DE", .type = PROPERTY_PIN, .v.gpio_list = { .gpio = GPIOD(19), .mul_sel = 3, .pull = 0, .drv_level = 3, }, }, #endif }; struct property_t g_lcd1_config[] = { { .name = "lcd_used", .type = PROPERTY_INTGER, .v.value = 0, }, }; struct property_t g_disp_config[] = { { .name = "disp_init_enable", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "disp_mode", .type = PROPERTY_INTGER, .v.value = 0, /* DISP_INIT_MODE_SCREEN0 */ }, { .name = "screen0_output_type", .type = PROPERTY_INTGER, .v.value = 1, /* DISP_OUTPUT_TYPE_LCD */ }, { .name = "screen0_output_mode", .type = PROPERTY_INTGER, .v.value = 4, }, { .name = "screen0_output_format", .type = PROPERTY_INTGER, .v.value = 1, }, { .name = "screen0_output_bits", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "screen0_output_eotf", .type = PROPERTY_INTGER, .v.value = 4, }, { .name = "screen0_output_cs", .type = PROPERTY_INTGER, .v.value = 257, }, { .name = "screen0_output_dvi_hdmi", .type = PROPERTY_INTGER, .v.value = 2, }, { .name = "screen0_output_range", .type = PROPERTY_INTGER, .v.value = 2, }, { .name = "screen0_output_scan", .type = PROPERTY_INTGER, .v.value = 0, }, { .name = "screen0_output_aspect_ratio", .type = PROPERTY_INTGER, .v.value = 8, }, }; u32 g_lcd0_config_len = sizeof(g_lcd0_config_rgb) / sizeof(struct property_t); u32 g_lcd1_config_len = sizeof(g_lcd1_config) / sizeof(struct property_t); u32 g_disp_config_len = sizeof(g_disp_config) / sizeof(struct property_t); static struct property_t *_lcd_property_find(const char *name, struct property_t *_config, const u32 config_len) { u32 i; for (i = 0; i < config_len; i++) { if (_config[i].type != PROPERTY_INTGER) { continue; } if (!strcmp(name, _config[i].name)) { return _config + i; } } return NULL; } #ifndef LCD_XML_CONFIG_FILE #define LCD_CONFIG_FILE "/etc/lcd_config.xml" #else #define LCD_CONFIG_FILE LCD_XML_CONFIG_FILE #endif const struct lcd_cfg_panel_info *load_lcd_config_from_xml(void) { struct property_t *_config_item; static rt_uint8_t init_state = 0; rt_enter_critical(); if (init_state == 0) { init_state = 1; rt_exit_critical(); } else { rt_exit_critical(); while (init_state != 2) { rt_thread_mdelay(10); } goto _RET; } g_lcd0_config = g_lcd0_config_rgb; g_lcd0_config_len = sizeof(g_lcd0_config_rgb) / sizeof(struct property_t); _RET: init_state = 2; _config_item = _lcd_property_find("lcd_x", g_lcd0_config, g_lcd0_config_len); _panel_info.width = _config_item->v.value; _config_item = _lcd_property_find("lcd_y", g_lcd0_config, g_lcd0_config_len); _panel_info.height = _config_item->v.value; return &_panel_info; }