[RK3399][Android7.1] 调试笔记RK DRM下屏幕显示分辨率的修改及代码流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33487044/article/details/85345510
平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

问题:

RK Linux4.4的系统显示框架发生了变化,现在使用的drm。没有使用`dtsi``文件方式去设置屏参,那我们要修改屏参例如:分辨率修改。

屏幕型号:

FriendlyELEC 7" inch eDP LCD Display with Cap-Touch (HD702E)

修改:

choose *HD702* as default

目录:kernel/drivers/gpu/drm/panel/panel-friendlyelec.c
panel_lcd_list[]结构体数组中描述了不同屏幕的屏参、名字。

static struct {
        char *name;
        struct lcd_desc *lcd;
        int ctp;
} panel_lcd_list[] = {
        { "HDMI",       &hdmi_def,       0  },

        { "HD702E",     &hd700, CTP_GOODIX  },
        { "HD101B",     &hd101, CTP_GOODIX  },
        { "S701",       &s70,   CTP_GOODIX  },
};

首先看一下lcd_desc结构体:
在这里插入图片描述

我们看一下HD702E屏幕描述lcd 屏参lcd_desc 类型的hd700结构体:
在这里插入图片描述

若我们要修改hd700中:height 改为880后的显示:
在这里插入图片描述

问题:屏参是如何获得?

1、platform_driver注册

有了设备树,实现devicedriver 的匹配利用"compatible"来匹配的,即设备树加载之后,内核会自动把设备树节点转换成platform_device这种格式,同时把名字放到of_node这个地方。
在这里插入图片描述
在这里插入图片描述

2、platform_device注册

设备树:
目录:kernel/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi

在这里插入图片描述

3、查看:

目录:sys/bus/platform/drivers/panel-friendlyelec
在这里插入图片描述

4、入口probe

首先看一下入口函数:panel_probe函数

static int panel_platform_probe(struct platform_device *pdev)
{
        return panel_probe(&pdev->dev);
}

在这里插入图片描述

获取屏参:panel_setup_lcd
在这里插入图片描述

疑惑:

通过打印日志发现:

在这里插入图片描述

很明显在panel_probeof_property_read_string没有拿到名为lcd的信息且刚开机就有一次屏参的选择(但是函数是static类型的啊)。

首先分析下of函数:
目录:drivers/of/base.c

/**
 * of_property_read_string - 提取字符串(属性值)
 * @np - 设备节点指针
 * @propname  - 属性名称
 * @out_string - 输出参数,指向字符串(属性值)
 * 成功:0;失败:负数,绝对值是错误码
 */
int of_property_read_string(struct device_node *np, const char *propname, const char **out_string);

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

首先我们要明确是那个结点:
panel_probe函数中添加打印:
printk("dev->of_node = %s ", dev->of_node->name);

在这里插入图片描述

然后再看一下设备树:
在这里插入图片描述

的确没有lcd

因此即使这里没有再次赋值刚开机也有个地方指定了默认分辨率。

我们忽视了一行代码:
early_param("lcd", panel_setup_lcd);
在这里插入图片描述

early_param宏来申明需要’早期’处理的启动参数。
我们将这行代码去掉,然后重新编译烧写内核。(可算把他给整黑屏了)
在这里插入图片描述

那么问题来了:早期函数调用时名字是谁给他的:

首先通过打印查看:

在这里插入图片描述

在这里插入图片描述

答案是UBOOT

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/85345510