日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

修改RK3399 HDMI显示分辨率

發(fā)布時間:2024/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 修改RK3399 HDMI显示分辨率 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自:
[RK3399] HDMI正常輸出4K30幀 無法輸出60幀以及設(shè)置分辨率的流程分析
**
Platform: ROCKCHIP
Chip: RK3399
OS: Android7.1.2
Kernel: 4.4.126*
**
【接上篇】上篇雖然HDMI能正常輸出4K,但是幀率卻達(dá)不到60幀,只能30幀,具體分析如下
按網(wǎng)上和官方的分別試了下修改,均沒成功kernel/driversideo/rockchipmi/rockchip-hdmiv2 中的 rockchip-hdmi.h 文件,
/* HDMI default vide mode */
#define HDMI_VIDEO_DEFAULT_MODE HDMI_1280X720P_60HZ

又在dtsi中加入 rockchip,defaultmode = <4>;也沒有成功。
以上是開機(jī)那時候的分辨率。
修改與現(xiàn)象

將輸出特殊分辨率的方法輸出
相關(guān)文件:
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
kernel/drivers/gpu/drm/drm_edid.c

如上修改:
1、在edid_cea_modes數(shù)據(jù)的最后定義特殊的分辨率(drm_edid.c文件中)。
2、把def_mode數(shù)組的第一個值改成特殊分辨率對應(yīng)的 vic(vic在drivers/gpu/drm/drm_edid.c文件中edid_cea_modes結(jié)構(gòu)體中).
3、edid = NULL;強(qiáng)制把edid賦為NULL,不管有沒有讀到edid都強(qiáng)制按def_modes來顯示。
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c下的函數(shù)dw_hdmi_connector_get_modes(),修改def_modes

def_modes[1] = {97};//3840x2160P60

燒錄設(shè)備結(jié)果:hdmi輸出顯示屏黑屏 cat 設(shè)備結(jié)果如下
在這里插入圖片描述

特殊分辨率 def_modes[1] = {108};//特殊分辨率 800x1280P60 /* 108 - 800x1280@60Hz */ kernel/drivers/gpu/drm/drm_edid.c里edid_cea_modes[]:新增如下特殊分辨率: { DRM_MODE(“800x1280”, DRM_MODE_TYPE_DRIVER, 76000, 800, 848, 880, 960, 0, 1280, 1300, 1304, 1314, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, 燒錄設(shè)備結(jié)果:出圖正常 cat 設(shè)備結(jié)果如下 在這里插入圖片描述 在這里插入圖片描述

原因:顯示屏不支持4K60hz,支支持4K30hz,所以導(dǎo)致設(shè)備分辨率為60hz時黑屏
其工作流程:底層通過edid,讀取到顯示器的分辨率列表,然后反饋給Android系統(tǒng),在系統(tǒng)界面里顯示出來
設(shè)置分辨率的流程分析

先通過i2c獲取屏的edid信息。
EDID的全稱是Extended Display Identification Data(擴(kuò)展顯示標(biāo)識數(shù)據(jù)),共有128字節(jié)。其中包含有關(guān)顯示器及其性能的參數(shù),包括供應(yīng)商信息、最大圖像大小、顏色設(shè)置、廠商預(yù)設(shè)置、
頻率范圍的限制以及顯示器名和序列號的字符串等等。

如何查看edid信息?
cat sys/class/drm/card0-HDMI-A-1/edid > /data/edid.bin //然后把edid.bin拷貝出來
或者:cat sys/class/drm/card0-HDMI-A-1/edid |busybox hexdump

驅(qū)動文件清單
通用屏配置驅(qū)動:
drivers/gpu/drm/panel/panel-simple.c //.c文件里面包含mipi的時序參數(shù)配置和mipi一些接口還有背光的使能關(guān)閉等,配置屏參可以在此文件或者dts

Core:
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
framebuffer drivers/gpu/drm/rockchip/rockchip_drm_fb.c
gem drivers/gpu/drm/rockchip/rockchip_drm_gem.c

vop:
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/rockchip/rockchip_vop_reg.c

lvds:
drivers/gpu/drm/rockchip/rockchip_lvds.c

rga:
drivers/gpu/drm/rockchip/rockchip_drm_rga.c

mipi:
drivers/gpu/drm/rockchip/dw-mipi-dsi.c

hdmi:
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
drivers/gpu/drm/bridge/dw-hdmi.c

inno hdmi:
drivers/gpu/drm/rockchip/inno_hdmi.c

edp:
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c

dp:
drivers/gpu/drm/rockchip/cdn-dp-core.c
drivers/gpu/drm/rockchip/cdn-dp-reg.c

具體相關(guān)接口分析:

基于component框架, 在probe階段解析dts中各個設(shè)備的信息, 加到component match 列表中, 等所有設(shè)備加
載完畢后, 就會引發(fā)master設(shè)備的bind.

Rockchip drm主設(shè)備驅(qū)動:drivers/gpu/drm/rockchip/rockchip_drm_drv.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.h

VOP驅(qū)動:drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/rockchip/rockchip_vop_reg.c

圖層接口:
static const struct drm_plane_helper_funcs plane_helper_funcs = {
// 預(yù)先對圖層進(jìn)行處理
.prepare_fb = vop_plane_prepare_fb,
// 圖層顯示完成后的處理
.cleanup_fb = vop_plane_cleanup_fb,
// 在顯示前進(jìn)行參數(shù)檢查
.atomic_check = vop_plane_atomic_check,
// 更新圖層參數(shù)
.atomic_update = vop_plane_atomic_update,
// 關(guān)閉圖層
.atomic_disable = vop_plane_atomic_disable,
};

VOP接口:
static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
// 使能vop, 在這里面會將timing配好
.enable = vop_crtc_enable,
// 關(guān)閉vop
.disable = vop_crtc_disable,
// 對timing進(jìn)行檢查修正
.mode_fixup = vop_crtc_mode_fixup,
// 在一幀顯示開始前做的處理
.atomic_begin = vop_crtc_atomic_begin,
// 檢查顯示的參數(shù)
.atomic_check = vop_crtc_atomic_check,
// 提交硬件顯示
.atomic_flush = vop_crtc_atomic_flush,
};

接口執(zhí)行順序:
vop_plane_atomic_check //在顯示前進(jìn)行參數(shù)檢查
vop_plane_prepare_fb //預(yù)先對圖層進(jìn)行處理
vop_plane_atomic_update //更新圖層參數(shù)
vop_crtc_atomic_flush //提交硬件顯示
vop_plane_cleanup_fb //圖層顯示完成后的處理

對應(yīng)文件:
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
./drivers/gpu/drm/drm_edid.c

調(diào)用get_modes獲取分辨率的時候會去調(diào)用

.get_modes = dw_hdmi_connector_get_modes->edid = drm_get_edid(connector, hdmi->ddc); //獲取edid->drm_do_get_edid->drm_do_probe_ddc_edid //嘗試通過i2獲取edid信息,成功時為0,失敗時為-1。->drm_get_displayid //如果edid存在,則獲取顯示id如果獲取到edid,則調(diào)用:hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid); //檢測顯示器是否是HDMI,是就返回true,否則return false;->drm_find_cea_extension //->drm_find_edid_extension //在edid中搜索CEA擴(kuò)展塊->if (cea_db_is_hdmi_vsdb(&edid_ext[i]))return true; //因為HDMI標(biāo)識符在特定于供應(yīng)商的塊中,所以從CEA擴(kuò)展的所有數(shù)據(jù)塊中搜索它。hdmi->sink_has_audio = drm_detect_monitor_audio(edid); //檢測顯示器audio音頻功能,如果顯示器支持音頻,就返回true,否則return false;drm_mode_connector_update_edid_property(connector, edid); //更新連接器的edid屬性cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid); ret = drm_add_edid_modes(connector, edid); //從連接的顯示器中讀取到的edid數(shù)據(jù)添加分辨率[mode](如果mode可用), *edid spec說 mode(分辨率)應(yīng)該按以下順序優(yōu)先選擇:*-首選 詳細(xì) mode(分辨率)*-來自基礎(chǔ)塊的其他詳細(xì) mode(分辨率)*-擴(kuò)展塊的詳細(xì) mode(分辨率)*-CVT 3字節(jié)代碼 mode(分辨率)*-標(biāo)準(zhǔn)定時代碼*-已建立的時間代碼*-根據(jù)GTF或CVT范圍信息推斷的 mode(分辨率)/* Store the ELD */drm_edid_to_eld(connector, edid); //從edid構(gòu)建ELD, 填充ELD(類似于edid的數(shù)據(jù))緩沖區(qū)以傳遞給音頻驅(qū)動程序。這個HDCP和端口字段留給圖形驅(qū)動程序填寫。drm_mode_connector_update_hdr_property(connector, metedata); //原子替換現(xiàn)有blob屬性如果獲取不到edid,則調(diào)用:hdmi->sink_is_hdmi = true;hdmi->sink_has_audio = true; for (i = 0; i < sizeof(def_modes); i++) { //去遍歷def_mode數(shù)組的值,他們對應(yīng)在edid_cea_modes里面的分辨率[mode]-->取自CEA-861規(guī)范。mode = drm_display_mode_from_vic_index(connector, def_modes, 31, i); //調(diào)用該接口來設(shè)置def_modes數(shù)組中第一個分辨率值->調(diào)用vic = svd_to_vic(video_db[video_index]); // vic值對應(yīng) edid_cea_modes 中的分辨率參數(shù)->if (!drm_valid_cea_vic(vic))->vic > 0 && vic < ARRAY_SIZE(edid_cea_modes); 則設(shè)置 edid_cea_modes 里面相應(yīng)的分辨率->newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);->drm_mode_copy(nmode, mode);分配和復(fù)制現(xiàn)有模式, 返回:成功時指向復(fù)制模式的指針,錯誤時為空。

總結(jié)

以上是生活随笔為你收集整理的修改RK3399 HDMI显示分辨率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。