ITOP-RK3588 HDMI强制分辨率跳过EDID

1.概要

2.内容

3.ITOP-RK3588 HDMI强制分辨率跳过EDID 

在ITOP-RK3588开发板上,如果需要通过HDMI强制输出特定分辨率并跳过EDID(扩展显示标识数据)的读取,您可以按照以下步骤进行配置和修改。EDID通常用于显示设备之间交换有关其显示能力的信息,但在某些情况下,可能需要强制输出特定的分辨率。

一、修改U-Boot代码

  1. 定位并修改dw_hdmi_qp.c文件

    • 打开路径为~/3588-linux/u-boot/drivers/video/drm/dw_hdmi_qp.c的文件。
    • 注释掉原有的默认分辨率数组:
       
      // const u8 def_modes_vic[6] = {4, 16, 2, 17, 31, 19};

    • 添加您需要的分辨率对应的VIC(视频标识码)值。例如,如果希望强制输出1280x720@60Hz的分辨率,其VIC值为4,则修改为:
       
      const u8 def_modes_vic[1] = {4};
  2. 修改edid.c文件

    • 打开路径为~/3588-linux/u-boot/common/edid.c的文件。
    • 找到static const struct drm_display_mode edid_cea_modes_1[]数组,确保其中包含了您需要的分辨率模式。

二、修改内核代码

  1. 定位并修改dw-hdmi-qp.c文件

    • 打开路径为~/3588-linux/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c的文件。
    • static const struct drm_display_mode dw_hdmi_default_modes[]数组中添加或修改为您需要的分辨率模式。例如,添加1280x720@60Hz的分辨率模式:

      static const struct drm_display_mode dw_hdmi_default_modes[] = {
          /* 4 - 1280x720@60Hz 16:9 */
          {
              DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250,
                       1280, 1390, 1430, 1650, 0,
                       720, 725, 730, 750, 0,
                       DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
              .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9,
          },
          // 其他分辨率模式...
      };
  2. 修改HDMI连接器的模式获取函数

    • 在同一个文件中,找到static int dw_hdmi_connector_get_modes(struct drm_connector *connector)函数。
    • 注释掉EDID读取的代码部分,使系统不依赖EDID来获取分辨率信息:
       

      static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
      {
          struct dw_hdmi_qp *hdmi = container_of(connector, struct dw_hdmi_qp, connector);
          struct hdr_static_metadata *metadata = &connector->hdr_sink_metadata.hdmi_type1;
          struct edid *edid;
          struct drm_display_mode *mode;
          struct drm_display_info *info = &connector->display_info;
          void *data = hdmi->plat_data->phy_data;
          int i, ret = 0;
      
          if (!hdmi->ddc)
              return 0;
      
          memset(metadata, 0, sizeof(*metadata));
      
          // 注释掉EDID读取部分
          // edid = drm_get_edid(connector, hdmi->ddc);
          edid = NULL;
      
          // 其他代码...
      
          return ret;
      }

三、修改设备树配置

  1. 定位并修改topeet_screen_lcds.dts文件

    • 打开路径为~/3588-linux/kernel/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts的文件。
    • 确保HDMI接口被正确启用,并配置为所需的模式。根据需要修改或添加相关的HDMI接口配置。

四、编译和烧写镜像

  • 完成上述修改后,重新编译U-Boot和内核镜像。
  • 将编译好的镜像烧写到ITOP-RK3588开发板上。

五、注意事项

  • 分辨率兼容性:确保强制输出的分辨率被您的显示设备支持,否则可能导致显示异常。
  • 系统稳定性:修改底层驱动和系统配置可能会影响系统的稳定性,建议在测试环境中进行充分验证。
  • 备份原始文件:在进行任何修改之前,建议备份原始文件,以便在需要时恢复。

通过上述步骤,您可以在ITOP-RK3588开发板上通过HDMI强制输出特定分辨率,并跳过EDID的读取。这在进行特定显示测试或开发时非常有用。

3.关联链接

ITOP-RK3588 HDMI强制分辨率跳过EDID_rk3588 hdmi强制输出-优快云博客

RK3588添加分辨率_rk3588添加hdmi分辨率-优快云博客

rk3588内核添加特殊分辨率_3588 hdmi 特殊分辨率-优快云博客

4.关联知识

1.HDMI_PICTURE_ASPECT_16_10的定义在那个文件中 

HDMI_PICTURE_ASPECT_16_10 的定义通常位于与HDMI或视频输出相关的内核头文件中。然而,具体的文件路径可能因不同的Linux发行版、内核版本或硬件平台而异。在Linux内核开发中,这种定义通常出现在包含HDMI或视频模式相关常量的头文件中。

虽然无法提供一个绝对准确的文件路径,但可以根据常见的Linux内核开发实践,推测 HDMI_PICTURE_ASPECT_16_10 可能定义在类似以下的文件中:

kernel/include/linux/hdmi.h 或 kernel/include/uapi/linux/hdmi.h:这些文件通常包含与HDMI相关的常量定义,包括视频模式、宽高比等。

kernel/drivers/video/rockchip/hdmi/rockchip-hdmi.h 或类似路径下的头文件:如果这是针对特定硬件平台(如Rockchip的RK3399proC)的HDMI驱动,那么相关的HDMI常量定义可能会出现在该硬件平台特定的驱动头文件中。

要找到确切的定义位置,建议:

查阅相关硬件平台的内核源码:如果你有访问特定硬件平台的内核源码的权限,可以直接在源码中搜索 HDMI_PICTURE_ASPECT_16_10。

查阅内核文档或开发者社区:内核开发者社区或文档可能会提供关于常量定义位置的额外信息。

使用代码搜索工具:如果你使用的是Linux发行版,并且安装了相应的内核源码包,可以使用代码搜索工具(如 grep、ack 或 ripgrep)在源码中搜索 HDMI_PICTURE_ASPECT_16_10。

请注意,由于内核源码的频繁更新和变化,具体的文件路径可能会随着时间而变化。因此,最可靠的方法是在你正在使用的特定内核版本和硬件平台的源码中搜索该常量。

iTOP-RK3588开发板上进行驱动开发,需要遵循一套完整的开发流程。以下是基于Rockchip平台和Linux内核的标准驱动开发步骤: ### 环境准备 1. **交叉编译工具链**:确保已经安装了适用于ARM架构的交叉编译工具链。 2. **内核源码**:获取适用于iTOP-RK3588开发板的Linux内核源码,通常可以从官方仓库或北京迅为提供的资料中获得。 3. **设备树配置**:根据硬件设计修改设备树(Device Tree)以包含新驱动所需的资源配置。 ### 驱动开发流程 #### 1. 编写驱动代码 创建一个新的C文件作为驱动程序,并实现必要的模块初始化、退出函数以及硬件操作接口。例如,一个简单的字符设备驱动可以如下所示: ```c #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> static dev_t dev_num; static struct cdev my_cdev; static int my_open(struct inode *inode, struct file *file) { printk(KERN_INFO "my device opened\n"); return 0; } static ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { // 实现读取功能 return 0; } static ssize_t my_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { // 实现写入功能 return count; } static struct file_operations fops = { .owner = THIS_MODULE, .open = my_open, .read = my_read, .write = my_write, }; static int __init my_module_init(void) { alloc_chrdev_region(&dev_num, 0, 1, "my_dev"); cdev_init(&my_cdev, &fops); cdev_add(&my_cdev, dev_num, 1); printk(KERN_INFO "my module loaded\n"); return 0; } static void __exit my_module_exit(void) { cdev_del(&my_cdev); unregister_chrdev_region(dev_num, 1); printk(KERN_INFO "my module unloaded\n"); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple example Linux module."); ``` #### 2. 修改Makefile 将新的驱动添加到内核源码中的适当位置,并更新对应的`Makefile`来包含该驱动的构建规则。 #### 3. 设备树配置 编辑`.dts`文件,在其中添加或修改节点以匹配新驱动的需求。比如对于PWM控制器,可能需要指定使用的GPIO引脚和其他相关参数[^2]。 #### 4. 构建与烧录 使用交叉编译工具链编译整个内核及模块,然后将生成的镜像文件通过适当的手段(如fastboot或者SD卡)加载到iTOP-RK3588开发板上。 #### 5. 测试与调试 - 在开发板上加载驱动模块:`insmod your_driver.ko` - 检查系统日志输出:`dmesg` - 使用`cat /proc/devices`查看主设备号是否正确注册 - 创建设备节点并测试其功能 ### 注意事项 - 开发过程中应密切关注内核版本兼容性问题。 - 对于特定外设的驱动开发,请参考芯片数据手册了解详细的寄存器配置方法。 - 利用现有的开源驱动作为模板可以帮助加快开发速度。 以上就是基于iTOP-RK3588开发板进行基本驱动开发的大致步骤。具体细节会因所要控制的硬件而有所不同,因此建议深入研究相关的硬件文档和技术资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值