尝试新增特殊分辨率(800x480)HDMI屏到RK3328(记录)
參考鏈接
https://www.cnblogs.com/lialong1st/p/9174475.html
https://www.forlinx.com/article-new-c22/341.html
https://www.cnblogs.com/zlh840/archive/2012/08/01/2618819.html
https://blog.csdn.net/weixin_42569429/article/details/112950569
https://www.cnblogs.com/xahsxd/p/14682195.html
https://bbs.t-firefly.com/forum.php?mod=viewthread&tid=2726&extra=page%3D1
https://blog.csdn.net/wowo1109/article/details/8805045
https://blog.csdn.net/dearsq/article/details/75645480
http://www.atmcu.com/1200.html
https://usermanual.wiki/Document/RK3399ClockGuidelinux44.1970364756/html
https://blog.csdn.net/wuweidonggmail/article/details/112057675
一,得到屏幕的EDID
1.打開EDID調試信息(查看LCD參數)
# vi ./kernel/drivers/video/fbdev/core/fbmon.c
//#undef DEBUG? /* define this for verbose EDID parsing output */
#define DEBUG
失敗
2.在ububtuPC上安裝read-edid查看該LCD參數
# sudo get-edid | parse-edid
...
Section "Monitor"
?? ?Identifier ""
?? ?ModelName ""
?? ?VendorName "ADA"
?? ?# Monitor Manufactured week 1 of 2007
?? ?# EDID version 1.3
?? ?# Digital Display
?? ?DisplaySize 150 100
?? ?Gamma 1.00
?? ?Option "DPMS" "false"
?? ?Modeline ?? ?"Mode 0" 32.00 800 840 888 928 480 493 496 525 -hsync -vsync
二.嘗試修改內核文件
1.在rockchip-hdmi.h (/kernel/drivers/video/rockchip/hdmi)
- enum hdmi_video_information_code 尾部增加vic枚舉值
? HDMI_800x480P_60HZ
2.在rockchip-hdmi-lcdc.c (/kernel/drivers/video/rockchip/hdmi)
-struct hdmi_video_timing hdmi_mode增加LCD參數(由上面modeline計算得到)
??? {
?? ??? ?.mode = {
?? ??? ??? ?.name = "800x480p@60Hz",//名稱
?? ??? ??? ?.refresh = 60,?? ??? ?//刷新頻率
?? ??? ??? ?.xres = 800,?? ??? ?//行像素 thd
?? ??? ??? ?.yres = 480,?? ??? ?//列像素 tvd
?? ??? ??? ?.pixclock = 32000000,?? ?//像素時鐘
?? ??? ??? ?.left_margin = 40,?? ?//水平后沿hb
?? ??? ??? ?.right_margin = 40,?? ?//水平前沿hfb
?? ??? ??? ?.upper_margin = 29,?? ?//垂直后沿vb
?? ??? ??? ?.lower_margin = 13,?? ?//垂直前沿 vfb
?? ??? ??? ?.hsync_len = 48,?? ?//行同步脈寬hpw
?? ??? ??? ?.vsync_len = 3,??????? //列同步脈寬vpw?? ?
?? ??? ??? ?.sync = 0,?? ??? ?//水平/垂直同步
?? ??? ??? ?.vmode = 0,
?? ??? ??? ?.flag = 0,
?? ??? ?},
?? ??? ?.vic = HDMI_800x480P_60HZ,
?? ??? ?.vic_2nd = 0,
?? ??? ?.pixelrepeat = 1,
?? ??? ?.interface = OUT_P888,
?? ?},
3.增加LCD參數到drm edid_cea_modes (kernel\drivers\gpu\drm\drm_edid.c)
以上更改都不能成功驅動屏幕
4.繼續測試,過程中發現是可以成功讀到LEDedid的,順便學習了一下
解析edid
[root@rk3328:/sys/devices/platform/display-subsystem/drm/card0/card0-HDMI-A-1]# od -x ./edid
0000000???????? ff00 ffff ffff 00ff 8104 0004 0001 0000
0000020 ????????1101 0301 0f80 000a 000a 0000 0000 0000
0000040 ????????0000 0000 0000 0101 0101 0101 0101 0101
0000060 ????????0101 0101 0101 0c80 8020 e030 102d 3028
0000100 ????????00d3 446c 0000 1800 0000 1000 0000 0000
0000120 ????????0000 0000 0000 0000 0000 0000 1000 0000
0000140 ????????0000 0000 0000 0000 0000 0000 0000 1000
0000160 ????????0000 0000 0000 0000 0000 0000 0000 1700
5.查看drm相關的dmesg 發現有CLOCK_RANGE(時鐘頻率出錯)報錯
//打開drm調試開關echo 0x1f > /sys/module/drm/parameters/debug dmesg | grep drm [ 7500.812744] [drm:drm_helper_hpd_irq_event] [CONNECTOR:69:HDMI-A-1] status updated from disconnected to connected [ 7500.812771] [drm:drm_sysfs_hotplug_event] generating hotplug event [ 7500.812876] [drm:drm_fb_helper_hotplug_event] [ 7500.812899] [drm:drm_helper_probe_single_connector_modes_merge_bits] [CONNECTOR:69:HDMI-A-1] [ 7500.919079] [drm:drm_edid_to_eld] ELD: no CEA Extension found [ 7500.919113] [drm:drm_property_unreference_blob] ffffffc07cd62a80: blob ID: 117 (1) [ 7500.919168] [drm:drm_mode_debug_printmodeline] Modeline 77:"800x480" 66 32000 800 840 888 928 480 493 496 525 0x48 0xa [ 7500.919188] [drm:drm_mode_prune_invalid] Not using 800x480 mode: CLOCK_RANGE [ 7500.919216] [drm:drm_setup_crtcs] [ 7500.919237] [drm:drm_enable_connectors] connector 69 enabled? yes [ 7500.919258] [drm:drm_target_preferred] looking for cmdline mode on connector 69 [ 7500.919341] [drm:drm_target_preferred] looking for preferred mode on connector 69 0 [ 7500.919359] [drm:drm_target_preferred] found mode none [ 7500.919378] [drm:drm_setup_crtcs] picking CRTCs for 8192x8192 config [ 7500.920372] [drm:drm_atomic_state_init] Allocated atomic state ffffffc07cd62280 [ 7500.920404] [drm:drm_atomic_get_plane_state] Added [PLANE:58] ffffffc05d7c8200 state to ffffffc07cd62280 [ 7500.920429] [drm:drm_atomic_get_plane_state] Added [PLANE:61] ffffffc05d7c8300 state to ffffffc07cd62280 [ 7500.920449] [drm:drm_atomic_set_fb_for_plane] Set [NOFB] for plane state ffffffc05d7c8300 [ 7500.920473] [drm:drm_atomic_get_plane_state] Added [PLANE:65] ffffffc05d7c8d00 state to ffffffc07cd62280 [ 7500.920492] [drm:drm_atomic_set_fb_for_plane] Set [NOFB] for plane state ffffffc05d7c8d00 [ 7500.920518] [drm:drm_atomic_get_crtc_state] Added [CRTC:64] ffffffc07b54a400 state to ffffffc07cd62280 [ 7500.920538] [drm:drm_atomic_set_mode_for_crtc] Set [NOMODE] for CRTC state ffffffc07b54a400 [ 7500.920556] [drm:drm_atomic_set_fb_for_plane] Set [NOFB] for plane state ffffffc05d7c8200 [ 7500.920578] [drm:drm_atomic_add_affected_connectors] Adding all current connectors for [CRTC:64] to ffffffc07cd62280 [ 7500.920598] [drm:drm_atomic_check_only] checking ffffffc07cd62280 [ 7500.920634] [drm:drm_atomic_commit] commiting ffffffc07cd62280 [ 7500.920678] [drm:drm_atomic_state_default_clear] Clearing atomic state ffffffc07cd62280 [ 7500.920703] [drm:drm_atomic_state_free] Freeing atomic state ffffffc07cd62280CLOCK_RANGE報錯對應的接口添加打印信息發現申請32M得到的時鐘是24M
drivers/gpu/drm/rockchip/rockchip_drm_vop.c-vop_crtc_mode_valid
?三.修改hdmi時鐘配置?
查看系統時鐘
[root@rk3328:~]# cat /sys/kernel/debug/clk/clk_summary
1.嘗試新增hdmiphy頻率到? pre_pll_cfg_table(kernel\drivers\phy\rockchip\phy-rockchip-inno-hdmi-phy.c )添加頻率32M
{ 32000000,? 32000000, 1,? 64, 2, 2, 2, 12, 2, 2,? 2, 0, 0}, //自行嘗試 可以成功驅動屏幕
2.咨詢廠商,根據RK提供的分頻工具得到分頻參數
hdmi配置指引和工具(https://download.csdn.net/download/mialo163/21130511)
總結: 對于我這個情況,只要添加一個pll配置即可驅動hdmi屏幕(800x480)
總結
以上是生活随笔為你收集整理的尝试新增特殊分辨率(800x480)HDMI屏到RK3328(记录)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑设备中PCI简易通讯控制器驱动显示黄
- 下一篇: 瓜子智能在线客服整体架构