尝试新增特殊分辨率(800x480)HDMI屏到RK3328(记录)

news/2025/2/13 23:57:36/

参考链接

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

解析128字节 (和pc读到的匹配)
0000000         ff00 ffff ffff 00ff 头 (大小端)8104 生产商0004 产品ID0001 0000 序列号
0000020(10)     1101 生产时间 17年1月0301 版本号80   信号类型0f   宽度 1600a   高度 100    00   gamma0a   DPMS属性00 0000 0000 //色度信息0000    
0000040(20)     0000 00(23)    0000000101 0101 0101 0101 0101//
0000060(30)     0101 0101 0101//详细信息描述1 每18字节        0c80 //像素时钟  800*480(0320 01e0)8020 //水平像素低8(20),水平像素balnking  e030 //水平像素高4位(03)&水平像素balnking高四位 垂直像素低8(e0)102d //垂直像素balnking(2d) 垂直像素高4位(01)&垂直像素balnking高四位3028 //水平信号偏移 水平脉宽
0000100(40)     00d3 //垂直偏移+垂直脉宽446c   //水平像素低8 垂直像素低8 尺寸mm0000   //高4位1800    //标志位 水平垂直同步0000 1000 0000 0000  //详细信息描述2
0000120(50)     0000 0000 0000 0000 00000000 1000 0000     //详细信息描述3
0000140(60)     0000 0000 0000 0000 0000 00000000 1000      //详细信息描述4    
0000160         0000 0000 0000 0000 0000 0000 000000 是否存在扩展edid17    校验和

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 ffffffc07cd62280

CLOCK_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)


http://www.ppmy.cn/news/628169.html

相关文章

【PCtoLCD】OLED显示汉字和图片

文章目录 前言一、取模汉字1.设置2.显示汉字 二、显示图片1.照片格式转换2.图片取模 总结 前言 PCtoLCD工具链接下载: 链接:https://pan.baidu.com/s/1KxyWcgbkp3vRlvovru3gGw 提取码:bl3e 一、取模汉字 1.设置 (1)选择字符模式 (2)字符设…

随机点餐小程序开发 让你轻松挑选美食

不知道大家有没有跟小编一样的困扰,一到饭点就为吃什么而发愁,选来选去不知道点什么,浪费了不少时间精力。随着互联网的深入发展,随机点餐随机吃饭小程序系统的开发,帮助“选择困难症”患者解决了这个难题,…

[TI TDA4 J721E]TIOVX 单屏显示多路摄像头数据(Mosaic节点使用)

首先感谢阅读,如果您也对TDA4相关的开发感兴趣,我们这边有个学习交流微信群,可以入群和大家一起交流学习。 资历较浅,水平有限,如遇错误,请大家多指正! 保持开源精神,共同分享、进…

Valens VS2000 系列HDBaseT2.0延长芯片

Valens Colligo VS2000 IC系列通过单个标准类别电缆汇聚和扩展A/V信号。Colligo芯片组支持扩展未压缩HDMI 1.4(4K604:2:0)、高保真音频、100Mbps以太网、USB2.0、控制和电源,通过CAT电缆传输长达100米(328英尺),无延迟…

KTM5000 KTM5010 KTM5020 KTM5030 MST扩展坞 多屏幕显示 多屏异显

支持多屏幕显示,支持单显8K,支持多屏异显 • USB Type-C DisplayPort Alt-mode de-mux  Simultaneous USB3.2 Gen2 and 2 lanes DP1.4a input OR 4 lanes DP1.4a input  Flip option for connector plug orientation  DP lane swap and polarity …

【01Studio MaixPy AI K210】7.IIC+OLED

目录 硬件准备: 引脚图: 01Studio K210核心板引脚 OLED引脚 电路连接 烧录驱动文件: 驱动文件 导包: I2C库 OLED库 配置I2C: 配置OLED: 例程: (以下内容均为个人所学总结&am…

Markdown 入门基础

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

基于matlab使用校准相机测量平面物体(附源码)

一、前言 此示例演示如何使用单个校准相机以世界单位测量硬币的直径。 此示例演示如何校准相机,然后使用它来测量平面对象(如硬币)的大小。这种方法的一个示例应用是测量传送带上的零件以进行质量控制。 二、校准相机 相机校准是估计镜头…