[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註冊
有了裝置樹,實現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