导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【已解决】D1s 调试 MIPI LCD 不亮

    MR Series
    7
    17
    7240
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • YuzukiTsuru
      柚木 鉉 LV 9 最后由 YuzukiTsuru 编辑

      Uboot阶段背光不亮,进Linux后背光亮了但是没有显示。感觉Uboot的开屏也有问题,为什么开了这么多次

      U-Boot 2018.05-00005-g7819edc-dirty (May 24 2022 - 13:34:56 +0800) Allwinner Technology
      
      [00.197]DRAM:  64 MiB
      [00.199]Relocation Offset is: 01ef2000
      [00.203]secure enable bit: 0
      [00.206]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz
      [00.213]flash init start
      [00.215]workmode = 0,storage type = 1
      [00.218][mmc]: mmc driver ver uboot2018:2021-11-19 15:38:00
      [00.224][mmc]: get sdc_type fail and use default host:tm1.
      [00.230][mmc]: can't find node "mmc0",will add new node
      [00.235][mmc]: fdt err returned <no error>
      [00.239][mmc]: Using default timing para
      [00.242][mmc]: SUNXI SDMMC Controller Version:0x50310
      [00.260][mmc]: card_caps:0x3000000a
      [00.263][mmc]: host_caps:0x3000003f
      [00.266]sunxi flash init ok
      [00.268]line:703 init_clocks
      [00.272]drv_disp_init
      [00.284]drv_disp_init finish
      [00.286]boot_gui_init:start
      [00.289]set disp.dev2_output_type fail. using defval=0
      [00.294]=====================lcd_open_flow
      [00.298]=====================lcd_open_flow
      [00.302]=====================lcd_power_on
      [00.492]boot_gui_init:finish
      [00.502]=====================lcd_open_flow
      partno erro : can't find partition bootloader
      54 bytes read in 4 ms (12.7 KiB/s)
      [00.982]bmp_name=bootlogo.bmp size 38454
      38454 bytes read in 8 ms (4.6 MiB/s)
      [01.029]Loading Environment from SUNXI_FLASH... OK
      [01.051]out of usb burn from boot: not need burn key
      [01.066]=====================lcd_open_flow
      [01.081]Item0 (Map) magic is bad
      [01.083]the secure storage item0 copy0 magic is bad
      [01.109]Item0 (Map) magic is bad
      [01.112]the secure storage item0 copy1 magic is bad
      [01.117]Item0 (Map) magic is bad
      partno erro : can't find partition private
      root_partition is rootfs
      set root to /dev/mmcblk0p5
      [01.134]update part info
      [01.139]update bootcmd
      [01.145]change working_fdt 0x42ab1da0 to 0x42a91da0
      disable nand error: FDT_ERR_BADPATH
      No reserved memory region found in source FDT
      [01.176]update dts
      noncached_alloc(): addr = 0x42c95200
      noncached_alloc(): addr = 0x42c95240
      noncached_alloc(): addr = 0x42c95280
      noncached_alloc(): addr = 0x42c[01.190]=====================lcd_open_flow
      [01.194]=====================lcd_bl_open
      [01.197]=====================lcd_open_flow
      [01.201]=====================lcd_open_flow
      [01.205]LCD open finish
      95ac0
      geth_sys_init:634: get node 'gmac0' error
      
      geth_sys_init fail!
      [01.213]Board Net Initialization Failed
      [01.217]No ethernet found.
      Hit any key to stop autoboot:  1 ... 0 
      [02.576]no vendor_boot partition is found
      Android's image name: d1s-rv_router
      Detect comp none
      [02.593]
      Starting kernel ...
      
      
      
      [    0.209348][DISP]disp_module_init
      [    0.210052]disp 5000000.disp: Adding to iommu group 0
      [    0.210823][DISP] disp_init,line:2386:
      [    0.210830]smooth display screen:0 type:1 mode:4
      [    0.252283]display_fb_request,fb_id:0
      [    0.268371]Freeing logo buffer memory: 1500K
      [    0.268990]disp_al_manager_apply ouput_type:1
      [    0.269256][DISP] lcd_clk_config,line:732:
      [    0.269270]disp 0, clk: pll(408000000),clk(408000000),dclk(34000000) dsi_rate(34000000)
      [    0.269270]     clk real:pll(408000000),clk(408000000),dclk(102000000) dsi_rate(150000000)
      [    0.269296][DISP] disp_sys_pwm_config,line:509:
      [    0.269299]disp_sys_pwm_Config, handle is NULL!
      [    0.269302][DISP] disp_sys_pwm_set_polarity,line:528:
      [    0.269305]disp_sys_pwm_Set_Polarity, handle is NULL!
      [    0.269554]=====================lcd_open_flow
      [    0.269560]=====================lcd_power_on
      [    0.270266]sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pd not found, using dummy regulator
      [    1.875671]=====================lcd_bl_open
      [    1.875682][DISP] disp_lcd_pwm_enable,line:1231:
      [    1.875685]pwm device hdl is NULL
      [    1.979054]Console: switching to colour frame buffer device 60x50
      [    2.053706][DISP]disp_module_init finish
      
      A 1 条回复 最后回复 回复 引用 分享 0
      • YuzukiTsuru
        柚木 鉉 LV 9 最后由 编辑

        驱动文件

        #include "d310t9362v1.h"
        
        static void lcd_power_on(u32 sel);
        static void lcd_power_off(u32 sel);
        static void lcd_bl_open(u32 sel);
        static void lcd_bl_close(u32 sel);
        
        static void lcd_panel_init(u32 sel);
        static void lcd_panel_exit(u32 sel);
        
        #define panel_reset(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val)
        
        static void lcd_cfg_panel_info(panel_extend_para *info)
        {
        	u32 i = 0, j = 0;
        	u32 items;
        	u8 lcd_gamma_tbl[][2] = {
        	    {0, 0},     {15, 15},   {30, 30},   {45, 45},   {60, 60},
        	    {75, 75},   {90, 90},   {105, 105}, {120, 120}, {135, 135},
        	    {150, 150}, {165, 165}, {180, 180}, {195, 195}, {210, 210},
        	    {225, 225}, {240, 240}, {255, 255},
        	};
        
        	u32 lcd_cmap_tbl[2][3][4] = {
        	    {
        		{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
        		{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
        		{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
        	    },
        	    {
        		{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
        		{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
        		{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
        	    },
        	};
        
        	items = sizeof(lcd_gamma_tbl) / 2;
        	for (i = 0; i < items - 1; i++) {
        		u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
        
        		for (j = 0; j < num; j++) {
        			u32 value = 0;
        
        			value =
        			    lcd_gamma_tbl[i][1] +
        			    ((lcd_gamma_tbl[i + 1][1] - lcd_gamma_tbl[i][1]) *
        			     j) /
        				num;
        			info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
        			    (value << 16) + (value << 8) + value;
        		}
        	}
        	info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items - 1][1] << 16) +
        				   (lcd_gamma_tbl[items - 1][1] << 8) +
        				   lcd_gamma_tbl[items - 1][1];
        
        	memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
        }
        
        static s32 lcd_open_flow(u32 sel)
        {
        	printk("=====================lcd_open_flow\n");
        	LCD_OPEN_FUNC(sel, lcd_power_on, 10);
        	LCD_OPEN_FUNC(sel, lcd_panel_init, 120);
        	LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 120);
        	LCD_OPEN_FUNC(sel, lcd_bl_open, 0);
        	return 0;
        }
        
        static s32 lcd_close_flow(u32 sel)
        {
        	printk("=====================lcd_close_flow\n");
        	LCD_CLOSE_FUNC(sel, lcd_bl_close, 0);
        	LCD_CLOSE_FUNC(sel, lcd_panel_exit, 200);
        	LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0);
        	LCD_CLOSE_FUNC(sel, lcd_power_off, 500);
        
        	return 0;
        }
        
        static void lcd_power_on(u32 sel)
        {
        	printk("=====================lcd_power_on\n");
        	sunxi_lcd_pin_cfg(sel, 1);
        	sunxi_lcd_power_enable(sel, 0);
        	// sunxi_lcd_power_enable(sel, 1);
        	sunxi_lcd_delay_ms(50);
        
        	/* reset lcd by gpio */
        	panel_reset(sel, 1);
        	sunxi_lcd_delay_ms(5);
        	panel_reset(sel, 0);
        	sunxi_lcd_delay_ms(10);
        	panel_reset(sel, 1);
        	sunxi_lcd_delay_ms(120);
        }
        
        static void lcd_power_off(u32 sel)
        {
        	printk("=====================lcd_power_off\n");
        	sunxi_lcd_pin_cfg(sel, 0);
        	sunxi_lcd_delay_ms(20);
        	panel_reset(sel, 0);
        	sunxi_lcd_delay_ms(5);
        	sunxi_lcd_power_disable(sel, 0);
        }
        
        static void lcd_bl_open(u32 sel)
        {
        	printk("=====================lcd_bl_open\n");
        	sunxi_lcd_pwm_enable(sel);
        	sunxi_lcd_backlight_enable(sel);
        }
        
        static void lcd_bl_close(u32 sel)
        {
        	printk("=====================lcd_bl_close\n");
        	sunxi_lcd_backlight_disable(sel);
        	sunxi_lcd_pwm_disable(sel);
        }
        
        #define REGFLAG_DELAY 0XFC
        #define REGFLAG_END_OF_TABLE 0xFD /* END OF REGISTERS MARKER */
        
        struct LCM_setting_table {
        	u8 cmd;
        	u32 count;
        	u8 para_list[32];
        };
        
        static struct LCM_setting_table lcm_initialization_setting[] = {
        	{0x01, 1, {0x00} },
        	{REGFLAG_DELAY, REGFLAG_DELAY, {120} },
        
        	{0x11, 1, {0x00} },
        	{REGFLAG_DELAY, REGFLAG_DELAY, {120} },
        
        	{0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x11} },
        	{0xd1, 1, {0x11} },
        	{0x55, 1, {0xb0} },
        
        	{0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x10} },
        	{0xc0, 2, {0x63, 0x00} }, // SCNL = (0x63 + 1) * 8 = 800
        	{0xc1, 2, {0x09, 0x02} }, // VFB=0x09  VBF=0x02
        	{0xc2, 2, {0x37, 0x08} }, // PCLK= 512 + (0x08 * 16) = 640
        
        	{0xc7, 1, {0x00} }, // x-dir  rotate 0 : 0x00     rotate 180 :0x04
        
        	{0xcc, 1, {0x38} },
        
        	{0xb0, 16, {0x00, 0x11, 0x19, 0x0c, 0x10, 0x06, 0x07, 0x0a, 0x09, 0x22,
        		   0x04, 0x10, 0x0e, 0x28, 0x30, 0x1c} },
        
        	{0xb1, 16, {0x00, 0x12, 0x19, 0x0d, 0x10, 0x04, 0x06, 0x07, 0x08, 0x23,
        		    0x04, 0x12, 0x11, 0x28, 0x30, 0x1c} },
        
        	{0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x11} }, //  enable  bk fun of  command 2  BK1
        	{0xb0, 1, {0x4d} },
        	{0xb1, 1, {0x5b} }, // 0x56  0x4a  0x5b
        	{0xb2, 1, {0x07} },
        	{0xb3, 1, {0x80} },
        	{0xb5, 1, {0x47} },
        	{0xb7, 1, {0x8a} },
        	{0xb8, 1, {0x21} },
        	{0xc1, 1, {0x78} },
        	{0xc2, 1, {0x78} },
        	{0xd0, 1, {0x88} },
        	{REGFLAG_DELAY, REGFLAG_DELAY, {100} },
        
        	{0xe0, 3, {0x00, 0x00, 0x02} },
        	{0xe1, 11, {0x01, 0xa0, 0x03, 0xa0, 0x02, 0xa0, 0x04, 0xa0, 0x00, 0x44,
        		    0x44} },
        	{0xe2, 12, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        		    0x00, 0x00} },
        	{0xe3, 4, {0x00, 0x00, 0x33, 0x33} },
        	{0xe4, 2, {0x44, 0x44} },
        	{0xe5, 16, {0x01, 0x26, 0xa0, 0xa0, 0x03, 0x28, 0xa0, 0xa0, 0x05, 0x2a,
        		    0xa0, 0xa0, 0x07, 0x2c, 0xa0, 0xa0} },
        	{0xe6, 4, {0x00, 0x00, 0x33, 0x33} },
        	{0xe7, 2, {0x44, 0x44} },
        	{0xe8, 16, {0x02, 0x26, 0xa0, 0xa0, 0x04, 0x28, 0xa0, 0xa0, 0x06, 0x2a,
        		    0xa0, 0xa0, 0x08, 0x2c, 0xa0, 0xa0} },
        	{0xeb, 7, {0x00, 0x01, 0xe4, 0xe4, 0x44, 0x00, 0x40} },
        	{0xed, 16, {0xff, 0xf7, 0x65, 0x4f, 0x0b, 0xa1, 0xcf, 0xff, 0xff, 0xfc,
        		    0x1a, 0xb0, 0xf4, 0x56, 0x7f, 0xff} },
        
        	{0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x00} },
        	{0x36, 1, {0x00} }, // U&D  Y-DIR  rotate 0: 0x00 : rotate 180 :0x10
        	{0x3a, 1, {0x55} },
        	{0x29, 1, {0x00} },
        	{REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
        };
        
        static void lcd_panel_init(u32 sel)
        {
        	u32 i = 0;
        	sunxi_lcd_dsi_clk_enable(sel);
        	sunxi_lcd_delay_ms(100);
        	for (i = 0;; i++) {
        		if (lcm_initialization_setting[i].count == REGFLAG_END_OF_TABLE)
        			break;
        		else if (lcm_initialization_setting[i].count == REGFLAG_DELAY) {
        			sunxi_lcd_delay_ms(lcm_initialization_setting[i].para_list[0]);
        		} else {
        			dsi_gen_wr(sel, lcm_initialization_setting[i].cmd,
        				   lcm_initialization_setting[i].para_list,
        				   lcm_initialization_setting[i].count);
        		}
        		/* break; */
        	}
        }
        
        static void lcd_panel_exit(u32 sel)
        {
        	sunxi_lcd_dsi_dcs_write_0para(sel, 0x10);
        	sunxi_lcd_delay_ms(80);
        	sunxi_lcd_dsi_dcs_write_0para(sel, 0x28);
        	sunxi_lcd_delay_ms(50);
        }
        
        /*sel: 0:lcd0; 1:lcd1*/
        static s32 lcd_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
        {
        	return 0;
        }
        
        __lcd_panel_t d310t9362v1_panel = {
        	/* panel driver name, must mach the name of
        	 * lcd_drv_name in sys_config.fex
        	 */
        	.name = "d310t9362v1",
        	.func = {
        		.cfg_panel_info = lcd_cfg_panel_info,
        		.cfg_open_flow = lcd_open_flow,
        		.cfg_close_flow = lcd_close_flow,
        		.lcd_user_defined_func = lcd_user_defined_func,
        	},
        };
        

        设备树文件

        &lcd0 {
        	lcd_used            = <1>;
        
        	lcd_driver_name     = "d310t9362v1";
        	lcd_if              = <4>;
        
        	lcd_x               = <480>;
        	lcd_y               = <800>;
        	lcd_width           = <40>;
        	lcd_height          = <67>;
        
        	lcd_dclk_freq       = <34>;
        	lcd_hbp             = <120>;
        	lcd_ht              = <624>;
        	lcd_hspw            = <48>;
        	lcd_vbp             = <28>;
        	lcd_vt              = <908>;
        	lcd_vspw            = <12>;
        
        	lcd_dsi_if          = <0>;
        	lcd_dsi_lane        = <2>;
        	lcd_lvds_if         = <0>;
        	lcd_lvds_colordepth = <0>;
        	lcd_lvds_mode       = <0>;
        	lcd_frm             = <0>;
        	lcd_hv_clk_phase    = <0>;
        	lcd_hv_sync_polarity= <0>;
        	lcd_io_phase        = <0x0000>;
        	lcd_gamma_en        = <0>;
        	lcd_bright_curve_en = <0>;
        	lcd_cmap_en         = <0>;
        	lcd_fsync_en        = <0>;
        	lcd_fsync_act_time  = <1000>;
        	lcd_fsync_dis_time  = <1000>;
        	lcd_fsync_pol       = <0>;
        
        	deu_mode            = <0>;
        	lcdgamma4iep        = <22>;
        	smart_color         = <90>;
        
        	lcd_gpio_0 = <&pio PD 9 GPIO_ACTIVE_HIGH>;
        	lcd_bl_en = <&pio PE 12 GPIO_ACTIVE_HIGH>;
        
        	pinctrl-0 = <&dsi2lane_pins_a>;
        	pinctrl-1 = <&dsi2lane_pins_b>;
        }
        
        1 条回复 最后回复 回复 引用 分享 1
        • YuzukiTsuru
          柚木 鉉 LV 9 最后由 编辑

          亮了,关闭uboot里的屏幕驱动就ok了,看来uboot的dsi驱动有bug啊

          4401e22d-fd64-413e-a889-5fc777f79252-image.png

          90cdd5cd-1d6d-4270-ad02-f28cadcc6a6f-cd2c1d19ed136f8ad9b0080b4f9bd29.jpg

          1 条回复 最后回复 回复 引用 分享 1
          • Referenced by  YuzukiTsuru YuzukiTsuru 
          • A
            anruliu LV 6 @YuzukiTsuru 最后由 编辑

            @yuzukitsuru
            调用多次lcd_open_flow是正常的,是在u-boot-2018/drivers/video/sunxi/disp2/disp/dev_disp.c的drv_lcd_open_callback函数中bsp_disp_lcd_get_open_flow调用的,主要是为了获取lcd_power_on、lcd_bl_open这些函数句柄。

            没有背光还是要检查供电情况,另外uboot的显示用的是uboot-board.dts,需要注意相关配置有没有配好。

            YuzukiTsuru 1 条回复 最后回复 回复 引用 分享 0
            • YuzukiTsuru
              柚木 鉉 LV 9 @anruliu 最后由 YuzukiTsuru 编辑

              @anruliu 都是配置好的,之前测试D1-H可以点亮。上面的驱动和设备树都是uboot的

              S 1 条回复 最后回复 回复 引用 分享 0
              • S
                smiletiger LV 6 @YuzukiTsuru 最后由 编辑

                @yuzukitsuru 你这个是不是这个bl没有去操作啊
                lcd_bl_en = <&pio PE 12 GPIO_ACTIVE_HIGH>;

                我在调试mipi的时候发现这个定义好像是离开uboot进入kernel之后才去操作拉高的,在uboot阶段你跟rst一样,去操作bl口子应该就好了吧

                1 条回复 最后回复 回复 引用 分享 1
                • YuzukiTsuru
                  柚木 鉉 LV 9 最后由 编辑

                  @smiletiger 是,但是如果开uboot的disp驱动,kernel就没有输出,关了uboot的就可以了

                  S 1 条回复 最后回复 回复 引用 分享 0
                  • S
                    smiletiger LV 6 @YuzukiTsuru 最后由 编辑

                    @yuzukitsuru 我这边试了下,uboot和kernel阶段都有logo显示正常的

                    W 1 条回复 最后回复 回复 引用 分享 0
                    • YuzukiTsuru
                      柚木 鉉 LV 9 最后由 编辑

                      @smiletiger 我这里的uboot没有显示,开了uboit的disp2在kernel内也没有显示

                      1 条回复 最后回复 回复 引用 分享 1
                      • W
                        wyljkl LV 7 最后由 编辑

                        你好,您的问题解决了吗。我目前也是遇到这个问题

                        1 条回复 最后回复 回复 引用 分享 1
                        • YuzukiTsuru
                          柚木 鉉 LV 9 最后由 编辑

                          @wyljkl 解决了

                          W 1 条回复 最后回复 回复 引用 分享 0
                          • W
                            wyljkl LV 7 @smiletiger 最后由 编辑

                            @smiletiger 在 D1s 调试 MIPI LCD 不亮 中说:

                            @yuzukitsuru 我这边试了下,uboot和kernel阶段都有logo显示正常
                            你好,这边logo显示是在哪个部分实现的呀?

                            1 条回复 最后回复 回复 引用 分享 0
                            • W
                              wyljkl LV 7 @YuzukiTsuru 最后由 编辑

                              @yuzukitsuru 是什么原因导致的呀?能否指点一下,非常感谢。

                              W 1 条回复 最后回复 回复 引用 分享 0
                              • W
                                wyljkl LV 7 @wyljkl 最后由 wyljkl 编辑

                                现在uboot部分都没有进入到LCD_open_flow 这个函数中,对比了驱动文件和设备树的名字也是一一致的:

                                驱动:

                                /*
                                 * drivers/video/sunxi/disp2/disp/lcd/K080_IM2HYL802R_800X1280.c
                                 *
                                 * Copyright (c) 2007-2018 Allwinnertech Co., Ltd.
                                 *
                                 * This software is licensed under the terms of the GNU General Public
                                 * License version 2, as published by the Free Software Foundation, and
                                 * may be copied, distributed, and modified under those terms.
                                 *
                                 * This program is distributed in the hope that it will be useful,
                                 * but WITHOUT ANY WARRANTY; without even the implied warranty of
                                 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                                 * GNU General Public License for more details.
                                 *
                                 */
                                
                                #include "K080_IM2HYL802R_800X1280.h"
                                //#include <mach/sys_config.h>
                                #include "panels.h"
                                
                                
                                /*
                                &lcd0 {
                                	lcd_used            = <1>;
                                	status              = "okay";
                                	lcd_driver_name     = "K080_IM2HYL802R_800X1280";
                                	lcd_backlight       = <50>;
                                	lcd_if              = <4>;
                                
                                	lcd_x               = <800>;
                                	lcd_y               = <1280>;
                                	lcd_width           = <135>;
                                	lcd_height          = <216>;
                                	lcd_dclk_freq       = <75>;
                                
                                	lcd_pwm_used        = <1>;
                                	lcd_pwm_ch          = <0>;
                                	lcd_pwm_freq        = <50000>;
                                	lcd_pwm_pol         = <1>;
                                	lcd_pwm_max_limit   = <255>;
                                
                                	lcd_hbp             = <88>;
                                	lcd_ht              = <960>;
                                	lcd_hspw            = <4>;
                                	lcd_vbp             = <12>;
                                	lcd_vt              = <1300>;
                                	lcd_vspw            = <4>;
                                
                                	lcd_frm             = <0>;
                                	lcd_gamma_en        = <0>;
                                	lcd_bright_curve_en = <0>;
                                	lcd_cmap_en         = <0>;
                                
                                	deu_mode            = <0>;
                                	lcdgamma4iep        = <22>;
                                	smart_color         = <90>;
                                
                                	lcd_dsi_if          = <0>;
                                	lcd_dsi_lane        = <4>;
                                	lcd_dsi_format      = <0>;
                                	lcd_dsi_te          = <0>;
                                	lcd_dsi_eotp        = <0>;
                                
                                	lcd_pin_power = "dcdc1";
                                	lcd_pin_power1 = "eldo3";
                                
                                	lcd_power = "eldo3";
                                
                                	lcd_power1 = "dcdc1";
                                	lcd_power2 = "dc1sw";
                                
                                	lcd_gpio_1 = <&pio PD 22 1 0 3 1>;
                                
                                	pinctrl-0 = <&dsi4lane_pins_a>;
                                	pinctrl-1 = <&dsi4lane_pins_b>;
                                
                                	lcd_bl_en = <&pio PB 8 1 0 3 1>;
                                	lcd_bl_0_percent	= <15>;
                                	lcd_bl_100_percent  = <100>;
                                };
                                
                                */
                                
                                extern s32 bsp_disp_get_panel_info(u32 screen_id, disp_panel_para *info);
                                static void LCD_power_on(u32 sel);
                                static void LCD_power_off(u32 sel);
                                static void LCD_bl_open(u32 sel);
                                static void LCD_bl_close(u32 sel);
                                
                                //static void LCD_panel_try_switch(u32 sel);
                                static void LCD_panel_init(u32 sel);
                                static void LCD_panel_exit(u32 sel);
                                
                                //static u8 const mipi_dcs_pixel_format[4] = {0x77,0x66,0x66,0x55};
                                #define panel_reset(val) sunxi_lcd_gpio_set_value(sel, 1, val)
                                #define power_en(val) sunxi_lcd_gpio_set_value(sel, 0, val)
                                
                                static void LCD_cfg_panel_info(panel_extend_para *info)
                                {
                                   printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	u32 i = 0, j = 0;
                                	u32 items;
                                	u8 lcd_gamma_tbl[][2] = {
                                		//{input value, corrected value}
                                		{0, 0},
                                		{15, 15},
                                		{30, 30},
                                		{45, 45},
                                		{60, 60},
                                		{75, 75},
                                		{90, 90},
                                		{105, 105},
                                		{120, 120},
                                		{135, 135},
                                		{150, 150},
                                		{165, 165},
                                		{180, 180},
                                		{195, 195},
                                		{210, 210},
                                		{225, 225},
                                		{240, 240},
                                		{255, 255},
                                	};
                                
                                	u32 lcd_cmap_tbl[2][3][4] = {
                                	{
                                		{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
                                		{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
                                		{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
                                		},
                                		{
                                		{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
                                		{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
                                		{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
                                		},
                                	};
                                
                                	items = sizeof(lcd_gamma_tbl) / 2;
                                	for (i = 0; i < items - 1; i++) {
                                		u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
                                
                                		for (j = 0; j < num; j++) {
                                			u32 value = 0;
                                
                                			value = lcd_gamma_tbl[i][1] + ((lcd_gamma_tbl[i + 1][1] - lcd_gamma_tbl[i][1]) * j) / num;
                                			info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] = (value << 16) + (value << 8) + value;
                                		}
                                	}
                                	info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items - 1][1] << 16) + (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
                                
                                	memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
                                
                                }
                                
                                static s32 LCD_open_flow(u32 sel)
                                {
                                	printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	LCD_OPEN_FUNC(sel, LCD_power_on, 100);   //open lcd power, and delay 50ms
                                	LCD_OPEN_FUNC(sel, LCD_panel_init, 200);   //open lcd power, than delay 200ms
                                	LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);     //open lcd controller, and delay 100ms
                                	LCD_OPEN_FUNC(sel, LCD_bl_open, 0);     //open lcd backlight, and delay 0ms
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                
                                	return 0;
                                }
                                
                                static s32 LCD_close_flow(u32 sel)
                                {
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	LCD_CLOSE_FUNC(sel, LCD_bl_close, 200);       //close lcd backlight, and delay 0ms
                                	LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 20);         //close lcd controller, and delay 0ms
                                	LCD_CLOSE_FUNC(sel, LCD_panel_exit,	10);   //open lcd power, than delay 200ms
                                	LCD_CLOSE_FUNC(sel, LCD_power_off, 500);   //close lcd power, and delay 500ms
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	return 0;
                                }
                                
                                static void LCD_power_on(u32 sel)
                                {
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	panel_reset(0);
                                	sunxi_lcd_power_enable(sel, 0);//config lcd_power pin to open lcd power
                                	sunxi_lcd_delay_ms(5);
                                	sunxi_lcd_power_enable(sel, 1);//config lcd_power pin to open lcd power1
                                	sunxi_lcd_delay_ms(5);
                                	sunxi_lcd_power_enable(sel, 2);//config lcd_power pin to open lcd power2
                                	sunxi_lcd_delay_ms(5);
                                	power_en(1);
                                	sunxi_lcd_delay_ms(20);
                                
                                	//panel_reset(1);
                                	sunxi_lcd_delay_ms(40);
                                	panel_reset(1);
                                	//sunxi_lcd_delay_ms(10);
                                	//panel_reset(0);
                                	//sunxi_lcd_delay_ms(5);
                                	//panel_reset(1);
                                	sunxi_lcd_delay_ms(120);
                                	//sunxi_lcd_delay_ms(5);
                                
                                	sunxi_lcd_pin_cfg(sel, 1);
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                }
                                
                                static void LCD_power_off(u32 sel)
                                {
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	sunxi_lcd_pin_cfg(sel, 0);
                                	power_en(0);
                                	sunxi_lcd_delay_ms(20);
                                	panel_reset(0);
                                	sunxi_lcd_delay_ms(5);
                                	sunxi_lcd_power_disable(sel, 2);//config lcd_power pin to close lcd power2
                                	sunxi_lcd_delay_ms(5);
                                	sunxi_lcd_power_disable(sel, 1);//config lcd_power pin to close lcd power1
                                	sunxi_lcd_delay_ms(5);
                                	sunxi_lcd_power_disable(sel, 0);//config lcd_power pin to close lcd power
                                   printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                }
                                
                                static void LCD_bl_open(u32 sel)
                                {
                                	printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	sunxi_lcd_pwm_enable(sel);
                                	sunxi_lcd_delay_ms(50);
                                	sunxi_lcd_backlight_enable(sel);//config lcd_bl_en pin to open lcd backlight
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                }
                                
                                static void LCD_bl_close(u32 sel)
                                {
                                printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	sunxi_lcd_backlight_disable(sel);//config lcd_bl_en pin to close lcd backlight
                                	sunxi_lcd_delay_ms(20);
                                	sunxi_lcd_pwm_disable(sel);
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                }
                                
                                #define REGFLAG_DELAY             						0XFE
                                #define REGFLAG_END_OF_TABLE      						0xFD   // END OF REGISTERS MARKER
                                
                                struct LCM_setting_table {
                                    u8 cmd;
                                    u32 count;
                                    u8 para_list[64];
                                };
                                
                                /*add panel initialization below*/
                                
                                static struct LCM_setting_table lcm_initialization_setting[] = {
                                    {0x80,    1,     {0x65} },
                                  //GIP_1
                                    {0x81,    1,     {0x99} },
                                    {0x82,    1,     {0x15} },
                                    {0x83,    1,     {0xD1} },     //STA Width 4H
                                    {0x84,    1,     {0x40} },
                                    {0x85,    1,     {0xDD} },     //STA Width 4H
                                    {0x86,    1,     {0xE8} },
                                    //CMD_Page 0
                                  {0xFF,    3,     {0x98, 0x81, 0x00} },
                                  //SLP OUT
                                  {0x11,     0,     {0x00} },  	// SLPOUT
                                  {REGFLAG_DELAY, REGFLAG_DELAY, {120} },
                                  //DISP ON
                                  {0x29,     0,     {0x00} },  	// DSPON
                                  {REGFLAG_DELAY, REGFLAG_DELAY, {5} },
                                  //TE ON
                                  {0x35,     0,     {0x00} },  	// TE
                                  {REGFLAG_DELAY, REGFLAG_DELAY, {5} },
                                
                                  {REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
                                };
                                
                                
                                static void LCD_panel_init(u32 sel)
                                {
                                		__u32 i;
                                	char model_name[25];
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	disp_sys_script_get_item("lcd0", "lcd_model_name", (int *)model_name, 25);
                                	sunxi_lcd_dsi_clk_enable(sel);
                                	sunxi_lcd_delay_ms(20);
                                	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SOFT_RESET);
                                	sunxi_lcd_delay_ms(10);
                                
                                	for (i = 0; ; i++) {
                                			if (lcm_initialization_setting[i].count == REGFLAG_END_OF_TABLE)
                                				break;
                                			else if (lcm_initialization_setting[i].count == REGFLAG_DELAY)
                                				sunxi_lcd_delay_ms(lcm_initialization_setting[i].para_list[0]);
                                #ifdef SUPPORT_DSI
                                			else
                                				dsi_dcs_wr(sel, lcm_initialization_setting[i].cmd, lcm_initialization_setting[i].para_list, lcm_initialization_setting[i].count);
                                #endif
                                		//break;
                                	}
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	return;
                                }
                                
                                static void LCD_panel_exit(u32 sel)
                                {
                                	 printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SET_DISPLAY_OFF);
                                	sunxi_lcd_delay_ms(20);
                                	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_ENTER_SLEEP_MODE);
                                	sunxi_lcd_delay_ms(80);
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                
                                	return ;
                                }
                                
                                //sel: 0:lcd0; 1:lcd1
                                static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
                                {
                                   printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                	return 0;
                                }
                                
                                //sel: 0:lcd0; 1:lcd1
                                /*static s32 LCD_set_bright(u32 sel, u32 bright)
                                {
                                	sunxi_lcd_dsi_dcs_write_1para(sel,0x51,bright);
                                	return 0;
                                }*/
                                
                                __lcd_panel_t K080_IM2HYL802R_800X1280_mipi_panel = {
                                	/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex */
                                	.name = "K080_IM2HYL802R_800X1280",
                                	.func = {
                                		.cfg_panel_info = LCD_cfg_panel_info,
                                		.cfg_open_flow = LCD_open_flow,
                                		.cfg_close_flow = LCD_close_flow,
                                		.lcd_user_defined_func = LCD_user_defined_func,
                                		//.set_bright = LCD_set_bright,
                                	},
                                };
                                

                                设备树:

                                &lcd0 {
                                	lcd_used            = <1>;
                                
                                	lcd_driver_name     = "K080_IM2HYL802R_800X1280";
                                	lcd_backlight       = <50>;
                                	lcd_if              = <4>;
                                /*
                                	lcd_x               = <1200>;
                                	lcd_y               = <1920>;
                                */
                                	lcd_x               = <1024>;
                                	lcd_y               = <600>;
                                	lcd_width           = <135>;
                                	lcd_height          = <216>;
                                	lcd_dclk_freq       = <156>;
                                
                                	lcd_pwm_used        = <0>;
                                	lcd_pwm_ch          = <7>;
                                	lcd_pwm_freq        = <50000>;
                                	lcd_pwm_pol         = <0>;
                                
                                	lcd_hbp             = <160>;
                                	lcd_ht              = <1354>;
                                	lcd_hspw            = <10>;
                                	lcd_vbp             = <23>;
                                	lcd_vt              = <636>;
                                	lcd_vspw            = <1>;
                                
                                	lcd_lvds_if         = <0>;
                                	lcd_lvds_colordepth = <1>;
                                	lcd_lvds_mode       = <0>;
                                	lcd_frm             = <0>;
                                	lcd_io_phase        = <0x0000>;
                                	lcd_gamma_en        = <0>;
                                	lcd_bright_curve_en = <0>;
                                	lcd_cmap_en         = <0>;
                                
                                	deu_mode            = <0>;
                                	lcdgamma4iep        = <22>;
                                	smart_color         = <90>;
                                	lcd_dsi_if          = <0>;
                                	lcd_dsi_lane        = <4>;
                                	lcd_dsi_format      = <0>;
                                	lcd_dsi_eotp        = <0>;
                                	lcd_dsi_port_num    = <0>;
                                	
                                	/*lcd_gpio_1 = <&pio PB 8 GPIO_ACTIVE_HIGH>;*/
                                	/*lcd_bl_en = <&pio PD 20 GPIO_ACTIVE_HIGH>;*/
                                	pinctrl-0 = <&dsi4lane_pins_a>;
                                	pinctrl-1 = <&dsi4lane_pins_b>;
                                };
                                
                                

                                启动logo:
                                mtdids : nand0=nand
                                mtdparts: mtdparts=nand:1024k@0(boot0)ro,3072k@1048576(uboot)ro,1024k@4194304(secure_storage)ro,-(sys)
                                [00.600]ubi0: attaching mtd4
                                [00.713]ubi0: scanning is finished
                                [00.719]ubi0: attached mtd4 (name "sys", size 123 MiB)
                                [00.724]ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 258048 bytes
                                [00.730]ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 2048
                                [00.736]ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
                                [00.743]ubi0: good PEBs: 492, bad PEBs: 0, corrupted PEBs: 0
                                [00.748]ubi0: user volume: 10, internal volumes: 1, max. volumes count: 128
                                [00.755]ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
                                [00.763]ubi0: available PEBs: 0, total reserved PEBs: 492, PEBs reserved for bad PEB handling: 20
                                [00.771]sunxi flash init ok
                                [00.774]line:703 init_clocks
                                [00.777]drv_disp_init
                                lcd_x = 1024 drv_disp_check_spec
                                lcd_y = 600 drv_disp_check_spec
                                drivers/video/sunxi/disp2/disp/de/disp_display.c 23 bsp_disp_init
                                drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c 1242 disp_init_al
                                drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c 1323 disp_init_al
                                drivers/video/sunxi/disp2/disp/de/disp_lcd.c 2892 disp_init_lcd
                                drivers/video/sunxi/disp2/disp/de/disp_display.c 65 bsp_disp_init
                                drivers/video/sunxi/disp2/disp/lcd/panels.c 184 lcd_init
                                drivers/video/sunxi/disp2/disp/dev_disp.c 720 sunxi_disp_get_source_ops
                                drivers/video/sunxi/disp2/disp/dev_disp.c 749 sunxi_disp_get_source_ops
                                drivers/video/sunxi/disp2/disp/lcd/panels.c 174 lcd_set_panel_funs
                                drivers/video/sunxi/disp2/disp/lcd/panels.c 178 lcd_set_panel_funs
                                drivers/video/sunxi/disp2/disp/lcd/panels.c 187 lcd_init
                                [00.856]drv_disp_init finish
                                [00.975]Loading Environment from SUNXI_FLASH... OK
                                [00.997]Item0 (Map) magic is bad

                                S 1 条回复 最后回复 回复 引用 分享 0
                                • S
                                  SongTao LV 4 @wyljkl 最后由 编辑

                                  @wyljkl 在 【已解决】D1s 调试 MIPI LCD 不亮 中说:

                                  现在uboot部分都没有进入到LCD_open_flow 这个函数中,对比了驱动文件和设备树的名字也是一一致的:

                                  驱动:

                                  /*
                                   * drivers/video/sunxi/disp2/disp/lcd/K080_IM2HYL802R_800X1280.c
                                   *
                                   * Copyright (c) 2007-2018 Allwinnertech Co., Ltd.
                                   *
                                   * This software is licensed under the terms of the GNU General Public
                                   * License version 2, as published by the Free Software Foundation, and
                                   * may be copied, distributed, and modified under those terms.
                                   *
                                   * This program is distributed in the hope that it will be useful,
                                   * but WITHOUT ANY WARRANTY; without even the implied warranty of
                                   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                                   * GNU General Public License for more details.
                                   *
                                   */
                                  
                                  #include "K080_IM2HYL802R_800X1280.h"
                                  //#include <mach/sys_config.h>
                                  #include "panels.h"
                                  
                                  
                                  /*
                                  &lcd0 {
                                  	lcd_used            = <1>;
                                  	status              = "okay";
                                  	lcd_driver_name     = "K080_IM2HYL802R_800X1280";
                                  	lcd_backlight       = <50>;
                                  	lcd_if              = <4>;
                                  
                                  	lcd_x               = <800>;
                                  	lcd_y               = <1280>;
                                  	lcd_width           = <135>;
                                  	lcd_height          = <216>;
                                  	lcd_dclk_freq       = <75>;
                                  
                                  	lcd_pwm_used        = <1>;
                                  	lcd_pwm_ch          = <0>;
                                  	lcd_pwm_freq        = <50000>;
                                  	lcd_pwm_pol         = <1>;
                                  	lcd_pwm_max_limit   = <255>;
                                  
                                  	lcd_hbp             = <88>;
                                  	lcd_ht              = <960>;
                                  	lcd_hspw            = <4>;
                                  	lcd_vbp             = <12>;
                                  	lcd_vt              = <1300>;
                                  	lcd_vspw            = <4>;
                                  
                                  	lcd_frm             = <0>;
                                  	lcd_gamma_en        = <0>;
                                  	lcd_bright_curve_en = <0>;
                                  	lcd_cmap_en         = <0>;
                                  
                                  	deu_mode            = <0>;
                                  	lcdgamma4iep        = <22>;
                                  	smart_color         = <90>;
                                  
                                  	lcd_dsi_if          = <0>;
                                  	lcd_dsi_lane        = <4>;
                                  	lcd_dsi_format      = <0>;
                                  	lcd_dsi_te          = <0>;
                                  	lcd_dsi_eotp        = <0>;
                                  
                                  	lcd_pin_power = "dcdc1";
                                  	lcd_pin_power1 = "eldo3";
                                  
                                  	lcd_power = "eldo3";
                                  
                                  	lcd_power1 = "dcdc1";
                                  	lcd_power2 = "dc1sw";
                                  
                                  	lcd_gpio_1 = <&pio PD 22 1 0 3 1>;
                                  
                                  	pinctrl-0 = <&dsi4lane_pins_a>;
                                  	pinctrl-1 = <&dsi4lane_pins_b>;
                                  
                                  	lcd_bl_en = <&pio PB 8 1 0 3 1>;
                                  	lcd_bl_0_percent	= <15>;
                                  	lcd_bl_100_percent  = <100>;
                                  };
                                  
                                  */
                                  
                                  extern s32 bsp_disp_get_panel_info(u32 screen_id, disp_panel_para *info);
                                  static void LCD_power_on(u32 sel);
                                  static void LCD_power_off(u32 sel);
                                  static void LCD_bl_open(u32 sel);
                                  static void LCD_bl_close(u32 sel);
                                  
                                  //static void LCD_panel_try_switch(u32 sel);
                                  static void LCD_panel_init(u32 sel);
                                  static void LCD_panel_exit(u32 sel);
                                  
                                  //static u8 const mipi_dcs_pixel_format[4] = {0x77,0x66,0x66,0x55};
                                  #define panel_reset(val) sunxi_lcd_gpio_set_value(sel, 1, val)
                                  #define power_en(val) sunxi_lcd_gpio_set_value(sel, 0, val)
                                  
                                  static void LCD_cfg_panel_info(panel_extend_para *info)
                                  {
                                     printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	u32 i = 0, j = 0;
                                  	u32 items;
                                  	u8 lcd_gamma_tbl[][2] = {
                                  		//{input value, corrected value}
                                  		{0, 0},
                                  		{15, 15},
                                  		{30, 30},
                                  		{45, 45},
                                  		{60, 60},
                                  		{75, 75},
                                  		{90, 90},
                                  		{105, 105},
                                  		{120, 120},
                                  		{135, 135},
                                  		{150, 150},
                                  		{165, 165},
                                  		{180, 180},
                                  		{195, 195},
                                  		{210, 210},
                                  		{225, 225},
                                  		{240, 240},
                                  		{255, 255},
                                  	};
                                  
                                  	u32 lcd_cmap_tbl[2][3][4] = {
                                  	{
                                  		{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
                                  		{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
                                  		{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
                                  		},
                                  		{
                                  		{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
                                  		{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
                                  		{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
                                  		},
                                  	};
                                  
                                  	items = sizeof(lcd_gamma_tbl) / 2;
                                  	for (i = 0; i < items - 1; i++) {
                                  		u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
                                  
                                  		for (j = 0; j < num; j++) {
                                  			u32 value = 0;
                                  
                                  			value = lcd_gamma_tbl[i][1] + ((lcd_gamma_tbl[i + 1][1] - lcd_gamma_tbl[i][1]) * j) / num;
                                  			info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] = (value << 16) + (value << 8) + value;
                                  		}
                                  	}
                                  	info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items - 1][1] << 16) + (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
                                  
                                  	memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
                                  
                                  }
                                  
                                  static s32 LCD_open_flow(u32 sel)
                                  {
                                  	printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	LCD_OPEN_FUNC(sel, LCD_power_on, 100);   //open lcd power, and delay 50ms
                                  	LCD_OPEN_FUNC(sel, LCD_panel_init, 200);   //open lcd power, than delay 200ms
                                  	LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);     //open lcd controller, and delay 100ms
                                  	LCD_OPEN_FUNC(sel, LCD_bl_open, 0);     //open lcd backlight, and delay 0ms
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  
                                  	return 0;
                                  }
                                  
                                  static s32 LCD_close_flow(u32 sel)
                                  {
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	LCD_CLOSE_FUNC(sel, LCD_bl_close, 200);       //close lcd backlight, and delay 0ms
                                  	LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 20);         //close lcd controller, and delay 0ms
                                  	LCD_CLOSE_FUNC(sel, LCD_panel_exit,	10);   //open lcd power, than delay 200ms
                                  	LCD_CLOSE_FUNC(sel, LCD_power_off, 500);   //close lcd power, and delay 500ms
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	return 0;
                                  }
                                  
                                  static void LCD_power_on(u32 sel)
                                  {
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	panel_reset(0);
                                  	sunxi_lcd_power_enable(sel, 0);//config lcd_power pin to open lcd power
                                  	sunxi_lcd_delay_ms(5);
                                  	sunxi_lcd_power_enable(sel, 1);//config lcd_power pin to open lcd power1
                                  	sunxi_lcd_delay_ms(5);
                                  	sunxi_lcd_power_enable(sel, 2);//config lcd_power pin to open lcd power2
                                  	sunxi_lcd_delay_ms(5);
                                  	power_en(1);
                                  	sunxi_lcd_delay_ms(20);
                                  
                                  	//panel_reset(1);
                                  	sunxi_lcd_delay_ms(40);
                                  	panel_reset(1);
                                  	//sunxi_lcd_delay_ms(10);
                                  	//panel_reset(0);
                                  	//sunxi_lcd_delay_ms(5);
                                  	//panel_reset(1);
                                  	sunxi_lcd_delay_ms(120);
                                  	//sunxi_lcd_delay_ms(5);
                                  
                                  	sunxi_lcd_pin_cfg(sel, 1);
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  }
                                  
                                  static void LCD_power_off(u32 sel)
                                  {
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	sunxi_lcd_pin_cfg(sel, 0);
                                  	power_en(0);
                                  	sunxi_lcd_delay_ms(20);
                                  	panel_reset(0);
                                  	sunxi_lcd_delay_ms(5);
                                  	sunxi_lcd_power_disable(sel, 2);//config lcd_power pin to close lcd power2
                                  	sunxi_lcd_delay_ms(5);
                                  	sunxi_lcd_power_disable(sel, 1);//config lcd_power pin to close lcd power1
                                  	sunxi_lcd_delay_ms(5);
                                  	sunxi_lcd_power_disable(sel, 0);//config lcd_power pin to close lcd power
                                     printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  }
                                  
                                  static void LCD_bl_open(u32 sel)
                                  {
                                  	printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	sunxi_lcd_pwm_enable(sel);
                                  	sunxi_lcd_delay_ms(50);
                                  	sunxi_lcd_backlight_enable(sel);//config lcd_bl_en pin to open lcd backlight
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  }
                                  
                                  static void LCD_bl_close(u32 sel)
                                  {
                                  printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	sunxi_lcd_backlight_disable(sel);//config lcd_bl_en pin to close lcd backlight
                                  	sunxi_lcd_delay_ms(20);
                                  	sunxi_lcd_pwm_disable(sel);
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  }
                                  
                                  #define REGFLAG_DELAY             						0XFE
                                  #define REGFLAG_END_OF_TABLE      						0xFD   // END OF REGISTERS MARKER
                                  
                                  struct LCM_setting_table {
                                      u8 cmd;
                                      u32 count;
                                      u8 para_list[64];
                                  };
                                  
                                  /*add panel initialization below*/
                                  
                                  static struct LCM_setting_table lcm_initialization_setting[] = {
                                      {0x80,    1,     {0x65} },
                                    //GIP_1
                                      {0x81,    1,     {0x99} },
                                      {0x82,    1,     {0x15} },
                                      {0x83,    1,     {0xD1} },     //STA Width 4H
                                      {0x84,    1,     {0x40} },
                                      {0x85,    1,     {0xDD} },     //STA Width 4H
                                      {0x86,    1,     {0xE8} },
                                      //CMD_Page 0
                                    {0xFF,    3,     {0x98, 0x81, 0x00} },
                                    //SLP OUT
                                    {0x11,     0,     {0x00} },  	// SLPOUT
                                    {REGFLAG_DELAY, REGFLAG_DELAY, {120} },
                                    //DISP ON
                                    {0x29,     0,     {0x00} },  	// DSPON
                                    {REGFLAG_DELAY, REGFLAG_DELAY, {5} },
                                    //TE ON
                                    {0x35,     0,     {0x00} },  	// TE
                                    {REGFLAG_DELAY, REGFLAG_DELAY, {5} },
                                  
                                    {REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
                                  };
                                  
                                  
                                  static void LCD_panel_init(u32 sel)
                                  {
                                  		__u32 i;
                                  	char model_name[25];
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	disp_sys_script_get_item("lcd0", "lcd_model_name", (int *)model_name, 25);
                                  	sunxi_lcd_dsi_clk_enable(sel);
                                  	sunxi_lcd_delay_ms(20);
                                  	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SOFT_RESET);
                                  	sunxi_lcd_delay_ms(10);
                                  
                                  	for (i = 0; ; i++) {
                                  			if (lcm_initialization_setting[i].count == REGFLAG_END_OF_TABLE)
                                  				break;
                                  			else if (lcm_initialization_setting[i].count == REGFLAG_DELAY)
                                  				sunxi_lcd_delay_ms(lcm_initialization_setting[i].para_list[0]);
                                  #ifdef SUPPORT_DSI
                                  			else
                                  				dsi_dcs_wr(sel, lcm_initialization_setting[i].cmd, lcm_initialization_setting[i].para_list, lcm_initialization_setting[i].count);
                                  #endif
                                  		//break;
                                  	}
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	return;
                                  }
                                  
                                  static void LCD_panel_exit(u32 sel)
                                  {
                                  	 printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SET_DISPLAY_OFF);
                                  	sunxi_lcd_delay_ms(20);
                                  	sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_ENTER_SLEEP_MODE);
                                  	sunxi_lcd_delay_ms(80);
                                    printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  
                                  	return ;
                                  }
                                  
                                  //sel: 0:lcd0; 1:lcd1
                                  static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
                                  {
                                     printf("%s %d %s\n",__FILE__,__LINE__,__FUNCTION__);
                                  	return 0;
                                  }
                                  
                                  //sel: 0:lcd0; 1:lcd1
                                  /*static s32 LCD_set_bright(u32 sel, u32 bright)
                                  {
                                  	sunxi_lcd_dsi_dcs_write_1para(sel,0x51,bright);
                                  	return 0;
                                  }*/
                                  
                                  __lcd_panel_t K080_IM2HYL802R_800X1280_mipi_panel = {
                                  	/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex */
                                  	.name = "K080_IM2HYL802R_800X1280",
                                  	.func = {
                                  		.cfg_panel_info = LCD_cfg_panel_info,
                                  		.cfg_open_flow = LCD_open_flow,
                                  		.cfg_close_flow = LCD_close_flow,
                                  		.lcd_user_defined_func = LCD_user_defined_func,
                                  		//.set_bright = LCD_set_bright,
                                  	},
                                  };
                                  

                                  设备树:

                                  &lcd0 {
                                  	lcd_used            = <1>;
                                  
                                  	lcd_driver_name     = "K080_IM2HYL802R_800X1280";
                                  	lcd_backlight       = <50>;
                                  	lcd_if              = <4>;
                                  /*
                                  	lcd_x               = <1200>;
                                  	lcd_y               = <1920>;
                                  */
                                  	lcd_x               = <1024>;
                                  	lcd_y               = <600>;
                                  	lcd_width           = <135>;
                                  	lcd_height          = <216>;
                                  	lcd_dclk_freq       = <156>;
                                  
                                  	lcd_pwm_used        = <0>;
                                  	lcd_pwm_ch          = <7>;
                                  	lcd_pwm_freq        = <50000>;
                                  	lcd_pwm_pol         = <0>;
                                  
                                  	lcd_hbp             = <160>;
                                  	lcd_ht              = <1354>;
                                  	lcd_hspw            = <10>;
                                  	lcd_vbp             = <23>;
                                  	lcd_vt              = <636>;
                                  	lcd_vspw            = <1>;
                                  
                                  	lcd_lvds_if         = <0>;
                                  	lcd_lvds_colordepth = <1>;
                                  	lcd_lvds_mode       = <0>;
                                  	lcd_frm             = <0>;
                                  	lcd_io_phase        = <0x0000>;
                                  	lcd_gamma_en        = <0>;
                                  	lcd_bright_curve_en = <0>;
                                  	lcd_cmap_en         = <0>;
                                  
                                  	deu_mode            = <0>;
                                  	lcdgamma4iep        = <22>;
                                  	smart_color         = <90>;
                                  	lcd_dsi_if          = <0>;
                                  	lcd_dsi_lane        = <4>;
                                  	lcd_dsi_format      = <0>;
                                  	lcd_dsi_eotp        = <0>;
                                  	lcd_dsi_port_num    = <0>;
                                  	
                                  	/*lcd_gpio_1 = <&pio PB 8 GPIO_ACTIVE_HIGH>;*/
                                  	/*lcd_bl_en = <&pio PD 20 GPIO_ACTIVE_HIGH>;*/
                                  	pinctrl-0 = <&dsi4lane_pins_a>;
                                  	pinctrl-1 = <&dsi4lane_pins_b>;
                                  };
                                  
                                  

                                  启动logo:
                                  mtdids : nand0=nand
                                  mtdparts: mtdparts=nand:1024k@0(boot0)ro,3072k@1048576(uboot)ro,1024k@4194304(secure_storage)ro,-(sys)
                                  [00.600]ubi0: attaching mtd4
                                  [00.713]ubi0: scanning is finished
                                  [00.719]ubi0: attached mtd4 (name "sys", size 123 MiB)
                                  [00.724]ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 258048 bytes
                                  [00.730]ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 2048
                                  [00.736]ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
                                  [00.743]ubi0: good PEBs: 492, bad PEBs: 0, corrupted PEBs: 0
                                  [00.748]ubi0: user volume: 10, internal volumes: 1, max. volumes count: 128
                                  [00.755]ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
                                  [00.763]ubi0: available PEBs: 0, total reserved PEBs: 492, PEBs reserved for bad PEB handling: 20
                                  [00.771]sunxi flash init ok
                                  [00.774]line:703 init_clocks
                                  [00.777]drv_disp_init
                                  lcd_x = 1024 drv_disp_check_spec
                                  lcd_y = 600 drv_disp_check_spec
                                  drivers/video/sunxi/disp2/disp/de/disp_display.c 23 bsp_disp_init
                                  drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c 1242 disp_init_al
                                  drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c 1323 disp_init_al
                                  drivers/video/sunxi/disp2/disp/de/disp_lcd.c 2892 disp_init_lcd
                                  drivers/video/sunxi/disp2/disp/de/disp_display.c 65 bsp_disp_init
                                  drivers/video/sunxi/disp2/disp/lcd/panels.c 184 lcd_init
                                  drivers/video/sunxi/disp2/disp/dev_disp.c 720 sunxi_disp_get_source_ops
                                  drivers/video/sunxi/disp2/disp/dev_disp.c 749 sunxi_disp_get_source_ops
                                  drivers/video/sunxi/disp2/disp/lcd/panels.c 174 lcd_set_panel_funs
                                  drivers/video/sunxi/disp2/disp/lcd/panels.c 178 lcd_set_panel_funs
                                  drivers/video/sunxi/disp2/disp/lcd/panels.c 187 lcd_init
                                  [00.856]drv_disp_init finish
                                  [00.975]Loading Environment from SUNXI_FLASH... OK
                                  [00.997]Item0 (Map) magic is bad

                                  大佬可以问一下这个问题你解决了吗,我也碰到了无法进入到LCD_open_flow 这个函数的情况,能否指点一下,非常感谢

                                  F 1 条回复 最后回复 回复 引用 分享 0
                                  • F
                                    fanhuacloud LV 6 @SongTao 最后由 编辑

                                    uboot下背光控制有问题,可以使用lcd-gpio手动开启背光,进系统之后再pwm调光即可

                                    1 条回复 最后回复 回复 引用 分享 0
                                    • N
                                      NathanLiu LV 5 最后由 编辑

                                      同样问题,解决后记录

                                      1 条回复 最后回复 回复 引用 分享 0
                                      • 1 / 1
                                      • First post
                                        Last post

                                      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                                      行为准则 | 用户协议 | 隐私权政策