1. 程式人生 > >[RK3399][Android7.1] 除錯筆記RK DRM下螢幕顯示解析度的修改及程式碼流程

[RK3399][Android7.1] 除錯筆記RK DRM下螢幕顯示解析度的修改及程式碼流程

平臺 核心版本 安卓版本
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