SSU_显示资源配置说明


1. HW资源分配

因硬件资源有限及DRM框架本身的限制(IFCD及HVP都只有一套,且DRM框架本身限制一个显示设备最多只能有31个plane),因此提供了以下接口供用户自定义这些资源的分配方式。

1.1. Cursor设置

我们的GOP有两层(UI及Cursor),其中UI固定做为primary plane,而Cursor可通过dts设置决定是否启用(不需要cursor的话可禁用以免占用DRM的一个plane)以及启用时用作什么类型的plane,设置方式如下:

/ {
    display-subsystem {
        display {
            disp0: port@0 {
                cursor-layer-enable = <1>;
                cursor-for-ui = <0>;
            };
            disp1: port@1 {
                cursor-layer-enable = <1>;
                cursor-for-ui = <0>;
            };
        };
    };
};

cursor-layer-enable用于标记该disp的cursor层是否启用,启用时将生成一个planecursor-for-ui决定cursor layer启用时在DRM中生成的plane类型,设置为0时生成的plane类型为DRM_PLANE_TYPE_CURSOR,一般用于绘制cursor;设置为1时生成的plane类型为DRM_PLANE_TYPE_OVERLAY,可用于绘制一层UI。

1.2. MOP资源分配

默认情况下每一个disp分别使用一个MOPG及MOPS,用户可根据实际使用场景分配mop的使用方式,比如只需用一个disp的输出的情况下则可以将所有的mop全部划分给disp 0使用(这样disp 0上有4层mop + 2层gop,总共6层layer),以最大化使用硬件资源。当前支持merge的方式如下图,只能merge到disp 0,无法merge到disp 1

可通过dts中mop-layers属性设置MOP资源的分配方式,如下:

/ {
    display-subsystem {
        display {
            disp0: port@0 {
                /* mop-layers = <layerId winCount ... ...>
                    layerId:  even for mopg, odd for mops
                    winCount: win count on mop layer
                */
                mop-layers = <0 12
                              1 1>;
            };
            disp1: port@1 {
                /* mop-layers = <layerId winCount ... ...>
                                 layerId:  even for mopg, odd for mops
                                 winCount: win count on mop layer
                */
                mop-layers = <2 12
                              3 1>;
            };
        };
    };
};

mop-layers属性值的设置规则如以上注册,为layerIdwinCount依次排列。其中

  • layerId表示某个layer用于它当前所属的disp上,偶数为mopg layer,奇数为mops layer

  • winCount表示使用该layer中的前n个gwin(对应到DRM中的plane)

如以上默认设置的含义为:一个mopg跟一个mops绑定到disp 0,其中mopg使用前12个gwin,mops使用1个gwin。

需注意所有disp的GOP gwin + MOP gwin总数不要超过31,否则超过的部分设置将无效

1.3. Preferred

用户可通过dts设置优先使用那一组disp及屏输出,设置此属性后将在指定CRTCConnector中新增Preferred属性,user app可通过此属性获取到用户指定的用于主屏输出的CRTCConnector。设置如下,可移动这个Preferred属性到所需要的disp或panel节点。

/ {
    display-subsystem {
        display {
            disp0: port@0 {
                preferred = <1>;
            };
        };
        dpi {
            preferred = <1>;
        };
    };
};

1.4. IFCD

当前芯片上只有一个IFCD,用户可根据实际情况选择将IFCD分配给某个disp上的GOP UI使用,结合Preferred属性可用于决定这个硬件使用在主屏或副屏上,以更合理的使用硬件资源。如低分辨率主屏 + 高分辨率副屏的情况,则将IFCD分配给副屏使用较为合理,反之亦然。IFCD的使用权设置方式如下:

/ {
    display-subsystem {
        display {
            disp0: port@0 {
                gop-ui-support-ifcd = <1>; /* Support IFCD for GOP_UI on this disp */
            };
        };
    };
};

1.5. HVP realtime

与上述IFCD的分配类似的,因当前只能串一路HVP realtime pipeline,可通过DTS设置合理分配此资源的使用,设置方式如下:

/ {
    display-subsystem {
        display {
            disp0: port@0 {
                mops-realtime = <1>;
            };
        };
    };
};

2. 点屏参考

2.1. 电源及背光控制设置

DRM支持屏幕的电源几背光控制,当前我们使用GPIO控制屏的电源及reset,使用pwm控制屏幕背光(以调节亮度),可通过dts设置具体的硬件接口。

屏的电源及reset控制接口设置方式如下:

/ {
    display-subsystem {
        panels {
            panel_misc:panel_misc {     /* 在屏参文件中会通过'misc'找到此节点 */
                power-gpios = <&gpio 108 0>;    /* pwoer控制IO口,不需要控制的话可不设置 */
                reset-gpios = <&gpio 110 0>;    /* reset控制IO口,不需要控制的话可不设置 */
            };
        };
    };
};

PWM背光控制使用的是kernel自带的pwm_bl驱动,参考kernel的相关文档设置即可,这里提供一个示例如下:

/ {
    display-subsystem {
        panels {
            backlight_ttl:backlight_ttl {       /* 在屏参文件中会通过'backlight'找到此节点 */
                compatible = "pwm-backlight";   /* pwm_bl驱动的compatible,请勿修改 */
                pwms = <&pwm 8 5000000 0>;      /* 使用那一组pwm控制背光 */
                brightness-levels = <0 100 1024>;   /* 亮度等级调节曲线 */
                num-interpolated-steps = <255>;
                default-brightness-level = <200>;   /* 默认亮度值 */
                status = "okay";
            };
        };
    };
};

2.2. 屏参设置

参考点屏参考文档,这里需要注意的是在屏参中需设置好屏的类型及上述的电源及背光控制节点,如:

/ {
    display-subsystem {
        panels {
            SAT070AT50H18BH {
                compatible = "sstar,panel";     /* 使用内置panel driver的compatible,请勿修改 */
                interface = "TTL"; /* TTL/MIPI/LVDS/BT1120/BT656 */     /* 屏的类型,需设置注释里的特定参数 */
                misc = <&panel_misc>;   /* 指定除背光外其他硬件相关信息节点 */
                backlight = <&backlight_ttl>;   /* 指定背光控制节点 */
                status = "okay";
                ...
            };
        };
    };
};