3399的-mipi适应多个lcd屏显示-后续1-uboot中的修改

一、前提:

1. rk3399核心板

2.uboot2017.09 源码

3. 多个MIPI显示屏的启动序列以及显示时序(重要)

4.rk3399MIPI通道0

二、内核中的dts,被修改部分,主要是显示部分

说明一下(uboot显示控制也是使用内核的dts来配置,所以只要关注内核的dts即可):

这里主要是分成三个部分:

1. mipi通道的一个整体设置,所有的屏都使用相同的配置。(显示正常)

2.panel-init-sequence,mipi屏的启动序列,发现每个屏都不相同,这里就多使用了几个不同的名字,以示区分。启动序列非常重要,没有配置或者配置错误将导致无法正常显示!!

3.display-timings中的各种时序,看上去是要根据屏的不同的屏而设置不同的时序。

&dsi {
		status = "okay";
		rockchip,lane-rate = <480>;

		panel {  //7inch
			status = "okay";
			compatible = "simple-panel-dsi";
			reg = <0>;
			power-supply = <&vcc3v3_sys>;
			backlight = <&backlight>;
			//enable-gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
			reset-delay-ms = <60>;
			enable-delay-ms = <60>;
			prepare-delay-ms = <60>;
			unprepare-delay-ms = <60>;
			disable-delay-ms = <60>;
			dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST)>;// |
			//		  MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
			dsi,format = <MIPI_DSI_FMT_RGB888>;
			dsi,lanes  = <4>;
#if 1		 //7inch				
			panel-init-sequence-7inch = [   //主要是uboot要使用
				39 00 03 F0 5A 5A
				39 00 03 F1 5A 5A 
				39 00 03 FC A5 A5 
				39 00 03 D0 00 10 
				15 00 02 B1 12
				39 00 05 B2 14 22 2F 04
				15 00 02 B3 51
				39 00 04 BC 01 4E 0A
				39 00 06 E1 03 10 1C A0 10
				39 00 09 EE 23 00 23 00 23 00 23 00
				39 00 09 EF 34 12 98 BA 20 00 24 80
				39 00 06 F2 02 08 08 40 10
				39 00 0b F3 01 97 20 22 84 07 27 10 26 00
				39 00 2e F4 02 02 1C 26 1D 02 03 03 03 1C 1C 03 00 0C 0C 03 02 03 06 06 13 14 01 15 01 04 02 61 78 79 72 E3 F3 F0 00 00 01 01 28 04 03 28 01 D1 32
				39 00 1b F5 8C 3C 3C 5A 3B B7 4E 0F 33 23 02 59 54 52 45 46 60 02 60 80 27 26 52 25 7A 1F
				39 00 07 F6 30 25 A6 00 00 00
				39 00 21 F7 0E 0E 0A 0A 0F 0F 0B 0B 05 07 01 01 01 01 01 01 0C 0C 08 08 0D 0D 09 09 04 06 01 01 01 01 01 01
				39 00 12 FA 00 30 0A 13 0B 11 17 16 19 21 23 22 23 22 21 20 26
				39 00 12 FB 00 3A 0A 13 0B 11 17 16 19 23 27 28 29 28 29 28 30
				15 00 02 B0 03
				39 00 03 FD 23 09
				39 00 07 FE 00 0D 03 21 80 78
				39 32 04 C3 40 00 28
				05 96 02 11 00
				05 00 02 35 00
				05 00 02 29 00
			];

#endif   //#if 1  7inch
		//2022-12-09
		panel-init-sequence-5inch-2 = [
				39 00 04 FF 98 81 03
				15 00 02 01 00
				15 00 02 02 00
				15 00 02 03 73
				15 00 02 04 00
				15 00 02 05 00
				15 00 02 06 0A
				15 00 02 07 00
				15 00 02 08 00
				15 00 02 09 01
				15 00 02 0a 00
				15 00 02 0b 00
				15 00 02 0c 01
				15 00 02 0d 00
				15 00 02 0e 00
				15 00 02 0f 1D
				15 00 02 10 1D
				15 00 02 11 00
				15 00 02 12 00
				15 00 02 13 00
				15 00 02 14 00
				15 00 02 15 00
				15 00 02 16 00
				15 00 02 17 00
				15 00 02 18 00
				15 00 02 19 00
				15 00 02 1a 00
				15 00 02 1b 00
				15 00 02 1c 00
				15 00 02 1d 00
				15 00 02 1e 40
				15 00 02 1f 80
				15 00 02 20 06
				15 00 02 21 02
				15 00 02 22 00
				15 00 02 23 00
				15 00 02 24 00
				15 00 02 25 00
				15 00 02 26 00
				15 00 02 27 00
				15 00 02 28 33
				15 00 02 29 03
				15 00 02 2a 00
				15 00 02 2b 00
				15 00 02 2c 00
				15 00 02 2d 00
				15 00 02 2e 00
				15 00 02 2f 00
				15 00 02 30 00
				15 00 02 31 00
				15 00 02 32 00
				15 00 02 33 00
				15 00 02 34 04
				15 00 02 35 00
				15 00 02 36 00
				15 00 02 37 00
				15 00 02 38 3C
				15 00 02 39 00
				15 00 02 3a 40
				15 00 02 3b 40
				15 00 02 3c 00
				15 00 02 3d 00
				15 00 02 3e 00
				15 00 02 3f 00
				15 00 02 40 00
				15 00 02 41 00
				15 00 02 42 00
				15 00 02 43 00
				15 00 02 44 00
				15 00 02 50 01
				15 00 02 51 23
				15 00 02 52 45
				15 00 02 53 67
				15 00 02 54 89
				15 00 02 55 ab
				15 00 02 56 01
				15 00 02 57 23
				15 00 02 58 45
				15 00 02 59 67
				15 00 02 5a 89
				15 00 02 5b ab
				15 00 02 5c cd
				15 00 02 5d ef
				15 00 02 5e 11
				15 00 02 5f 01
				15 00 02 60 00
				15 00 02 61 15
				15 00 02 62 14
				15 00 02 63 0E
				15 00 02 64 0F
				15 00 02 65 0C
				15 00 02 66 0D
				15 00 02 67 06
				15 00 02 68 02
				15 00 02 69 07
				15 00 02 6a 02
				15 00 02 6b 02
				15 00 02 6c 02
				15 00 02 6d 02
				15 00 02 6e 02
				15 00 02 6f 02
				15 00 02 70 02
				15 00 02 71 02
				15 00 02 72 02
				15 00 02 73 02
				15 00 02 74 02
				15 00 02 75 01
				15 00 02 76 00
				15 00 02 77 14
				15 00 02 78 15
				15 00 02 79 0E
				15 00 02 7a 0F
				15 00 02 7b 0C
				15 00 02 7c 0D
				15 00 02 7d 06
				15 00 02 7e 02
				15 00 02 7f 07
				15 00 02 80 02
				15 00 02 81 02
				15 00 02 82 02
				15 00 02 83 02
				15 00 02 84 02
				15 00 02 85 02
				15 00 02 86 02
				15 00 02 87 02
				15 00 02 88 02
				15 00 02 89 02
				15 00 02 8A 02
				39 00 04 FF 98 81 04
				15 00 02 38 01
				15 00 02 39 00
				15 00 02 6C 15
				15 00 02 6E 2B
				15 00 02 6F 33
				15 00 02 8D 18
				15 00 02 87 BA
				15 00 02 26 76
				15 00 02 B2 D1
				15 00 02 B5 06
				15 00 02 3A 24
				15 00 02 35 1F
				39 00 04 FF 98 81 01
				15 00 02 22 0A
				15 00 02 31 00
				15 00 02 40 33
				15 00 02 53 A8
				15 00 02 55 a8
				15 00 02 50 96
				15 00 02 51 96
				15 00 02 60 22
				15 00 02 61 00
				15 00 02 62 19
				15 00 02 63 00
				15 00 02 A0 08
				15 00 02 A1 11
				15 00 02 A2 19
				15 00 02 A3 0D
				15 00 02 A4 0D
				15 00 02 A5 1E
				15 00 02 A6 14
				15 00 02 A7 17
				15 00 02 A8 4F
				15 00 02 A9 1A
				15 00 02 AA 27
				15 00 02 AB 49
				15 00 02 AC 1A
				15 00 02 AD 18
				15 00 02 AE 4C
				15 00 02 AF 22
				15 00 02 B0 27
				15 00 02 B1 4B
				15 00 02 B2 60
				15 00 02 B3 39
				15 00 02 C0 08
				15 00 02 C1 11
				15 00 02 C2 19
				15 00 02 C3 0D
				15 00 02 C4 0D
				15 00 02 C5 1E
				15 00 02 C6 14
				15 00 02 C7 17
				15 00 02 C8 4F
				15 00 02 C9 1A
				15 00 02 CA 27
				15 00 02 CB 49
				15 00 02 CC 1A
				15 00 02 CD 18
				15 00 02 CE 4C
				15 00 02 CF 33
				15 00 02 D0 27
				15 00 02 D1 4B
				15 00 02 D2 60
				15 00 02 D3 39
				39 00 04 FF 98 81 00
				15 00 02 36 00
				15 00 02 35 00
				05 ff 01 11
				05 14 01 29
			];


#if 1  //2022-12月取消使用
			panel-init-sequence-5inch = [
				39 00 04 FF 98 81 03
				15 00 02 01 00
				15 00 02 02 00
				15 00 02 03 73
				15 00 02 04 D3
				15 00 02 05 00
				15 00 02 06 0A
				15 00 02 07 0E
				15 00 02 08 00
				15 00 02 09 01
				15 00 02 0A 01
				15 00 02 0B 01
				15 00 02 0C 01
				15 00 02 0D 01
				15 00 02 0E 01
				15 00 02 0F 01
				15 00 02 10 01
				15 00 02 11 00
				15 00 02 12 00
				15 00 02 13 00
				15 00 02 14 00
				15 00 02 15 00
				15 00 02 16 00
				15 00 02 17 00
				15 00 02 18 00
				15 00 02 19 00
				15 00 02 1A 00
				15 00 02 1B 00
				15 00 02 1C 00
				15 00 02 1D 00
				15 00 02 1E 40
				15 00 02 20 06
				15 00 02 21 01
				15 00 02 22 00
				15 00 02 23 00
				15 00 02 24 00
				15 00 02 25 00
				15 00 02 26 00
				15 00 02 27 00
				15 00 02 28 33
				15 00 02 29 03
				15 00 02 2A 00
				15 00 02 2B 00
				15 00 02 2C 00
				15 00 02 2D 00
				15 00 02 2E 00
				15 00 02 2F 00
				15 00 02 30 00
				15 00 02 31 00
				15 00 02 32 00
				15 00 02 33 00
				15 00 02 34 03
				15 00 02 35 00
				15 00 02 36 03
				15 00 02 37 00
				15 00 02 38 00
				15 00 02 39 00
				15 00 02 3A 40
				15 00 02 3B 40
				15 00 02 3C 00
				15 00 02 3D 00
				15 00 02 3E 00
				15 00 02 3F 00
				15 00 02 40 00
				15 00 02 41 00
				15 00 02 42 00
				15 00 02 43 00
				15 00 02 44 00
				15 00 02 50 01
				15 00 02 51 23
				15 00 02 52 45
				15 00 02 53 67
				15 00 02 54 89
				15 00 02 55 AB
				15 00 02 56 01
				15 00 02 57 23
				15 00 02 58 45
				15 00 02 59 67
				15 00 02 5A 89
				15 00 02 5B AB
				15 00 02 5C CD
				15 00 02 5D EF
				15 00 02 5E 11
				15 00 02 5F 08
				15 00 02 60 02
				15 00 02 61 00
				15 00 02 62 01
				15 00 02 63 0D
				15 00 02 64 0C
				15 00 02 65 02
				15 00 02 66 02
				15 00 02 67 02
				15 00 02 68 02
				15 00 02 69 02
				15 00 02 6A 02
				15 00 02 6B 0F
				15 00 02 6C 02
				15 00 02 6D 02
				15 00 02 6E 02
				15 00 02 6F 02
				15 00 02 70 02
				15 00 02 71 02
				15 00 02 72 0E
				15 00 02 73 06
				15 00 02 74 07
				15 00 02 75 08
				15 00 02 76 02
				15 00 02 77 00
				15 00 02 78 01
				15 00 02 79 0D
				15 00 02 7A 0C
				15 00 02 7B 02
				15 00 02 7C 02
				15 00 02 7D 02
				15 00 02 7E 02
				15 00 02 7F 02
				15 00 02 80 02
				15 00 02 81 0F
				15 00 02 82 02
				15 00 02 83 02
				15 00 02 84 02
				15 00 02 85 02
				15 00 02 86 02
				15 00 02 87 02
				15 00 02 88 0E
				15 00 02 89 06
				15 00 02 8A 07
				39 00 04 FF 98 81 04
				15 00 02 6C 15
				15 00 02 6E 1A
				15 00 02 6F 33
				15 00 02 8D 15
				15 00 02 3A A4
				15 00 02 87 2A
				15 00 02 63 C0
				15 00 02 26 76
				15 00 02 B2 D1
				39 00 04 FF 98 81 01
				15 00 02 22 09
				15 00 02 31 00
				15 00 02 50 9E
				15 00 02 51 9E
				15 00 02 53 5D
				15 00 02 55 61
				15 00 02 60 14
				15 00 02 A0 00
				15 00 02 A1 1B
				15 00 02 A2 2B
				15 00 02 A3 15
				15 00 02 A4 19
				15 00 02 A5 2C
				15 00 02 A6 20
				15 00 02 A7 1D
				15 00 02 A8 98
				15 00 02 A9 1D
				15 00 02 AA 29
				15 00 02 AB 8A
				15 00 02 AC 1D
				15 00 02 AD 1C
				15 00 02 AE 50
				15 00 02 AF 24
				15 00 02 B0 2C
				15 00 02 B1 52
				15 00 02 B2 60
				15 00 02 B3 2A
				15 00 02 C0 00
				15 00 02 C1 1B
				15 00 02 C2 2C
				15 00 02 C3 16
				15 00 02 C4 18
				15 00 02 C5 2C
				15 00 02 C6 20
				15 00 02 C7 23
				15 00 02 C8 98
				15 00 02 C9 1D
				15 00 02 CA 2A
				15 00 02 CB 8A
				15 00 02 CC 1E
				15 00 02 CD 1D
				15 00 02 CE 50
				15 00 02 CF 24
				15 00 02 D0 2C
				15 00 02 D1 52
				15 00 02 D2 60
				15 00 02 D3 2A
				39 00 04 FF 98 81 00
				39 00 03 51 0F FF
				15 00 02 53 24
				15 00 02 55 01
				15 00 02 35 00
				05 00 01 34
				15 0A 02 36 03
				05 78 01 11
				05 14 01 29
			];
#endif   //#if 1  //板2,有残影,2022-12月取消使用
			disp_timings: display-timings {
				native-mode = <&timing3>;     //用于板1显示屏
				native-mode-5inch = <&timing1>;  //用于板2
				native-mode-5inch-2 = <&timing2>;//用于板3
				native-mode-7inch = <&timing0>;  //用于板4
				timing1: jc_5inch {  //5inch
					clock-frequency = <76600000>;
					hactive = <720>;
					hfront-porch = <80>;
					hback-porch = <150>;
					hsync-len = <10>;
					vactive = <1280>;
					vfront-porch = <20>;
					vback-porch = <20>;
					vsync-len = <10>;
					hsync-active = <10>;
					vsync-active = <10>;
					de-active = <0>;
					pixelclk-active = <0>;
				};
				timing0: timing0 {   //7inch
					clock-frequency = <62200000>;
					hactive = <720>;
					hfront-porch = <52>;
					hback-porch = <52>;
					hsync-len = <8>;
					vactive = <1280>;
					vfront-porch = <8>;
					vback-porch = <5>;
					vsync-len = <3>;
					hsync-active = <0>;
					vsync-active = <0>;
					de-active = <0>;
					pixelclk-active = <0>;
				};
				timing2: jc_5inch-2 {  //
					clock-frequency = <76600000>;
					hactive = <720>;
					hfront-porch = <80>;
					hback-porch = <150>;
					hsync-len = <10>;
					vactive = <1280>;
					vfront-porch = <20>;
					vback-porch = <20>;
					vsync-len = <10>;
					hsync-active = <10>;
					vsync-active = <10>;
					de-active = <0>;
					pixelclk-active = <0>;					 
					};
				timing3: jiekou_jc {  //序列为3
					 clock-frequency = <56480000>;
					 hactive = <1024>;
					 hfront-porch = <128>;
					 hsync-len = <32>;
					 hback-porch = <128>;
					 vactive = <600>;
					 vfront-porch = <16>;
					 vsync-len = <4>;
					 vback-porch = <16>;				 
					 hsync-active = <0>;
					 vsync-active = <0>;
					 de-active = <0>;
					 pixelclk-active = <0>;
					 
					};
				
			};
	};
};

三、uboot中涉及的显示源码部分

主要是两个文件:drivers/video/drm下,rockchip_panel.c和rockchip_display.c

3.1 rockchip_panel.c 中的修改部分(约在400行左右):

static int rockchip_panel_ofdata_to_platdata(struct udevice *dev)
{
    struct rockchip_panel_plat *plat = dev_get_platdata(dev);
    const void *data = NULL;
    int len = 0;
    int ret;

    com4_init();
    com4_send_cmd();
    mdelay(5);
    //com4_recv_lcd_type_data();
    ret = com4_recv_lcd_type_data();
    if(ret == 6)
        gd->lcd_type = 2;  //表示 第二种5寸屏
    else if(ret >= 0 && ret < 6)
    {
        gd->lcd_type = !(ret&1);  //ret最低位为0表示7寸,ret最低位为1表示5寸,
    }
    else 
        gd->lcd_type = -1;  //不能识别的屏

    
    printf("com4_recv_data = %d\n",gd->lcd_type);

    plat->power_invert = dev_read_bool(dev, "power-invert");

    plat->delay.prepare = dev_read_u32_default(dev, "prepare-delay-ms", 0);
    plat->delay.unprepare = dev_read_u32_default(dev, "unprepare-delay-ms", 0);
    plat->delay.enable = dev_read_u32_default(dev, "enable-delay-ms", 0);
    plat->delay.disable = dev_read_u32_default(dev, "disable-delay-ms", 0);
    plat->delay.init = dev_read_u32_default(dev, "init-delay-ms", 0);
    plat->delay.reset = dev_read_u32_default(dev, "reset-delay-ms", 0);

    plat->bus_format = dev_read_u32_default(dev, "bus-format",
                        MEDIA_BUS_FMT_RBG888_1X24);
    plat->bpc = dev_read_u32_default(dev, "bpc", 8);

    printf("gd->lcd_type = %d\n",gd->lcd_type);
    if(gd->lcd_type >= 0)
    {
        if(gd->lcd_type == 2)  // ,2022-12-09
        {
            data = dev_read_prop(dev, "panel-init-sequence-5inch-2", &len);  
        }
        else
            data = dev_read_prop(dev, gd->lcd_type?"panel-init-sequence-7inch":"panel-init-sequence-5inch", &len);
    }
//    else  //不需要初始化序列!!!  2022-12-09
//        data = dev_read_prop(dev, "panel-init-sequence", &len);

//    printf("data = %p\n",data);
    

    if (data) {
        plat->on_cmds = calloc(1, sizeof(*plat->on_cmds));
        if (!plat->on_cmds)
            return -ENOMEM;

        ret = rockchip_panel_parse_cmds(data, len, plat->on_cmds);
        if (ret) {
            printf("failed to parse panel init sequence\n");
            goto free_on_cmds;
        }
    }

    data = dev_read_prop(dev, "panel-exit-sequence", &len);
    if (data) {
        plat->off_cmds = calloc(1, sizeof(*plat->off_cmds));
        if (!plat->off_cmds) {
            ret = -ENOMEM;
            goto free_on_cmds;
        }

        ret = rockchip_panel_parse_cmds(data, len, plat->off_cmds);
        if (ret) {
            printf("failed to parse panel exit sequence\n");
            goto free_cmds;
        }
    }

    return 0;

free_cmds:
    free(plat->off_cmds);
free_on_cmds:
    free(plat->on_cmds);
    return ret;
}

3.2 rockchip_display.c 中的修改部分 (约在267行)

static int display_get_timing_from_dts(struct panel_state *panel_state,
                       struct drm_display_mode *mode)
{
    struct rockchip_panel *panel = panel_state->panel;
    int phandle;
    int hactive, vactive, pixelclock;
    int hfront_porch, hback_porch, hsync_len;
    int vfront_porch, vback_porch, vsync_len;
    int val, flags = 0;
    ofnode timing, native_mode;

    timing = dev_read_subnode(panel->dev, "display-timings");
    if (!ofnode_valid(timing))
        return -ENODEV;

    printf("111.gd->lcd_type = %d\n",gd->lcd_type);
    native_mode = ofnode_find_subnode(timing, "timing");
    if (!ofnode_valid(native_mode)) {
        printf("gd->lcd_type = %d\n",gd->lcd_type);
        if(gd->lcd_type >= 0)
        {
            if(gd->lcd_type == 2)    // 第二块5寸屏            
                phandle = ofnode_read_u32_default(timing, "native-mode-5inch-2", -1);  //2022-12-09
            else
                phandle = ofnode_read_u32_default(timing, gd->lcd_type?"native-mode-7inch":"native-mode-5inch", -1);  //2022-12-05
        }
        else //默认为xx板的时序
            phandle = ofnode_read_u32_default(timing, "native-mode", -1);

        printf("phandle = %d\n",phandle);
        native_mode = np_to_ofnode(of_find_node_by_phandle(phandle));
        if (!ofnode_valid(native_mode)) {
            printf("failed to get display timings from DT\n");
            return -ENXIO;
        }
    }

#define FDT_GET_INT(val, name) \
    val = ofnode_read_s32_default(native_mode, name, -1); \
    if (val < 0) { \
        printf("Can't get %s\n", name); \
        return -ENXIO; \
    }

#define FDT_GET_INT_DEFAULT(val, name, default) \
    val = ofnode_read_s32_default(native_mode, name, default);

    FDT_GET_INT(hactive, "hactive");
    FDT_GET_INT(vactive, "vactive");
    FDT_GET_INT(pixelclock, "clock-frequency");
    FDT_GET_INT(hsync_len, "hsync-len");
    FDT_GET_INT(hfront_porch, "hfront-porch");
    FDT_GET_INT(hback_porch, "hback-porch");
    FDT_GET_INT(vsync_len, "vsync-len");
    FDT_GET_INT(vfront_porch, "vfront-porch");
    FDT_GET_INT(vback_porch, "vback-porch");
    FDT_GET_INT(val, "hsync-active");
    flags |= val ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
    FDT_GET_INT(val, "vsync-active");
    flags |= val ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
    FDT_GET_INT(val, "pixelclk-active");
    flags |= val ? DRM_MODE_FLAG_PPIXDATA : 0;

    FDT_GET_INT_DEFAULT(val, "screen-rotate", 0);
    if (val == DRM_MODE_FLAG_XMIRROR) {
        flags |= DRM_MODE_FLAG_XMIRROR;
    } else if (val == DRM_MODE_FLAG_YMIRROR) {
        flags |= DRM_MODE_FLAG_YMIRROR;
    } else if (val == DRM_MODE_FLAG_XYMIRROR) {
        flags |= DRM_MODE_FLAG_XMIRROR;
        flags |= DRM_MODE_FLAG_YMIRROR;
    }
    mode->hdisplay = hactive;
    mode->hsync_start = mode->hdisplay + hfront_porch;
    mode->hsync_end = mode->hsync_start + hsync_len;
    mode->htotal = mode->hsync_end + hback_porch;

    mode->vdisplay = vactive;
    mode->vsync_start = mode->vdisplay + vfront_porch;
    mode->vsync_end = mode->vsync_start + vsync_len;
    mode->vtotal = mode->vsync_end + vback_porch;

    mode->clock = pixelclock / 1000;
    mode->flags = flags;

    return 0;
}

四、发送自定义bootargs给内核,让内核的显示也能正常初始化。

下一节再讲内核中显示驱动的修改部分。

arch/arm/lib/bootm.c 文件:(约224行)

/* Subcommand: PREP */
static void boot_prep_linux(bootm_headers_t *images)
{
    char *commandline = NULL;

    if(gd->lcd_type>=0)
    {
       char new_bootargs[512] = {0};
       char* old_bootargs = env_get("bootargs");
       int old_len = strlen(old_bootargs);

       strncpy(new_bootargs, old_bootargs, old_len);
       sprintf(new_bootargs, "%s lcd_type=%d", new_bootargs, gd->lcd_type);
       env_set("bootargs", new_bootargs);
      
    }

    commandline = env_get("bootargs");

    //char *commandline = env_get("bootargs");

    if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
#ifdef CONFIG_OF_LIBFDT
        debug("using: FDT\n");
        if (image_setup_linux(images)) {
            printf("FDT creation failed! hanging...");
            hang();
        }
#endif
    } else if (BOOTM_ENABLE_TAGS) {
        debug("using: ATAGS\n");
        setup_start_tag(gd->bd);
        if (BOOTM_ENABLE_SERIAL_TAG)
            setup_serial_tag(&params);
        if (BOOTM_ENABLE_CMDLINE_TAG)
            setup_commandline_tag(gd->bd, commandline);
        if (BOOTM_ENABLE_REVISION_TAG)
            setup_revision_tag(&params);
        if (BOOTM_ENABLE_MEMORY_TAGS)
            setup_memory_tags(gd->bd);
        if (BOOTM_ENABLE_INITRD_TAG) {
            /*
             * In boot_ramdisk_high(), it may relocate ramdisk to
             * a specified location. And set images->initrd_start &
             * images->initrd_end to relocated ramdisk's start/end
             * addresses. So use them instead of images->rd_start &
             * images->rd_end when possible.
             */
            if (images->initrd_start && images->initrd_end) {
                setup_initrd_tag(gd->bd, images->initrd_start,
                         images->initrd_end);
            } else if (images->rd_start && images->rd_end) {
                setup_initrd_tag(gd->bd, images->rd_start,
                         images->rd_end);
            }
        }
        setup_board_tags(&params);
        setup_end_tag(gd->bd);
    } else {
        printf("FDT and ATAGS support not compiled in - hanging\n");
        hang();
    }
}
 

谢谢观看,欢迎指教

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: rk uboot logo分区是在Rockchip平台下的U-Boot bootloader的logo区域。这个分区用于存储设备启动时显示的品牌LOGO或者其他的图形界面。在启动期间,当设备进入U-Boot bootloader时,该区域的图像将会被显示。 RK U-Boot logo分区通常包含了厂商的标志或者是其他品牌部署需要的图形,这个分区被称为boot logo分区。这里的rk是指Rockchip,一个集成电路设计公司。 RK U-Boot logo分区一般体积较小,往往只有几十KB或数百KB大小。管理这个分区可以使用命令行或者其他专门的软件,这些软件可以负责将图像文件写入分区。 RK U-Boot logo分区的重要性在于能够为厂商不仅仅提供一个标志,同时确保了良好的用户体验。现在,品牌LOGO已经成为了区分产品的一种方式,而这个分区也强调了不同平台的不同体系架构,并提供了一个共同的工具,用于管理各种设备的启动菜单和图形元素。 ### 回答2: rk uboot logo分区是申威科技公司针对RK处理器平台开发的一种开机logo显示方案。该方案采用uboot引导程序进行控制,通过分区的方式实现logo显示。 在rk uboot logo分区方案,将显示logo的资源文件打包成一个固定格式的文件,并将其烧录至特定的分区。uboot在启动时会自动加载该分区的logo资源文件,然后在幕上显示logo图案。 与传统的开机logo显示方案相比,rk uboot logo分区的优势在于其灵活性和可重用性。由于logo资源文件与系统分开存放,因此可以方便地更新或修改logo样式。同时,不同型号的产品也可以共用同一套logo资源文件,减少开发成本和时间。 总之,rk uboot logo分区是一种简单易用、灵活可靠的系统开机logo显示方案,已经得到越来越广泛的应用。 ### 回答3: rk uboot logo分区是指在嵌入式设备,使用Rockchip处理器的uboot引导程序时,将不同的logo图标分区存储在该设备的闪存,通过uboot程序调用不同的logo图标来显示在启动过程。 Rockchip处理器是当前市场上使用最广泛的一款嵌入式处理器,其uboot引导程序是启动整个系统的重要组成部分。而通过使用rk uboot logo分区技术,可以为不同的设备制作独特的启动logo,提升品牌形象和用户体验。 rk uboot logo分区技术的实现过程是将多个不同的logo图标按照设备型号、版本等分类,存储在闪存的不同分区。当设备启动时,uboot程序会根据设备的型号、版本等信息读取相应的logo图标,并将其显示幕上。这样做的好处是可以提升品牌形象和用户体验,增强用户对产品的信任感和归属感。 总之,rk uboot logo分区技术是一种高效的嵌入式设备启动logo管理方式,可以为不同的设备生产独特的logo图标,提升品牌形象和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值