平台 | 内核版本 | 安卓版本 |
---|---|---|
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注册
有了设备树,实现device
与 driver
的匹配利用"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_probe
中of_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