1.概要
2.内容
为RK3588添加1280x800的分辨率,可以按照以下步骤进行。这些步骤涉及对驱动程序和设备树文件的修改,请确保您有相应的开发环境和权限来执行这些操作。
一、确定添加分辨率的类型
首先,您需要确定是将1280x800作为正常分辨率添加,还是在特定情况下强制使用该分辨率。
- 正常分辨率:开机时EDID自动识别并显示合适的分辨率。
- 特殊分辨率:在某些情况下强制使用该分辨率。
二、添加正常分辨率
如果您希望1280x800作为正常分辨率被EDID自动识别,可以按照以下步骤操作:
-
找到EDID驱动代码
通常,EDID驱动代码位于
kernel/drivers/gpu/drm/drm_edid.c
文件中。 -
修改edid_cea_modes_1数组
在
edid_cea_modes_1[]
分辨率数组中添加1280x800的分辨率。由于该数组的大小有限(通常为127个元素),您可能需要移除或替换一个不常用的分辨率。static const struct drm_display_mode edid_cea_modes_1[] = { /* 现有分辨率... */ /* 添加1280x800@60Hz分辨率 */ { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, 1480, 1680, 0, 800, 803, 809, 831, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10, }, /* ...其他分辨率 */ };
-
重新编译内核
修改完代码后,重新编译内核以应用更改。将编译好的内核镜像烧写到开发板上。
三、添加特殊分辨率(如果需要)
如果您希望在特定情况下强制使用1280x800分辨率,可以按照以下步骤操作:
-
找到HDMI驱动代码
通常,HDMI驱动代码位于
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
文件中。 -
修改dw_hdmi_default_modes数组
在
dw_hdmi_default_modes[]
中添加1280x800的分辨率,并关闭EDID识别。static const struct drm_display_mode dw_hdmi_default_modes[] = { /* 现有分辨率... */ /* 添加1280x800@60Hz特殊分辨率 */ { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, 1480, 1680, 0, 800, 803, 809, 831, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10, }, /* ...其他分辨率 */ };
同时,在HDMI驱动代码中禁用EDID识别,以强制使用
dw_hdmi_default_modes[]
中的分辨率。 -
修改设备树(如果需要)
在某些情况下,您可能还需要在设备树文件中进行相应的配置。打开对应的DTS文件,例如
rockchip/your_board_name.dtsi
,确保HDMI输出端口和显示控制器的配置正确。 -
重新编译设备树
使用
dtc
工具编译DTS文件,生成DTB文件。 -
烧写设备树
将编译好的DTB文件烧写到开发板上。
四、测试和验证
完成以上步骤后,启动开发板并连接显示器。检查显示器是否能够正确显示1280x800的分辨率。如果出现任何问题,请检查您的配置和代码修改是否正确。
注意:在实际操作中,请确保您有相应的开发环境和权限来执行这些操作。如果您不熟悉内核和设备树的开发,建议在有经验的开发者的指导下进行操作。同时,备份原始文件和配置,以便在出现问题时能够快速恢复。
3.关联链接
4.关联知识
1.上面“picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10,”中的 HDMI_PICTURE_ASPECT_16_10是系统中没有定义的变量
如果在代码中看到 HDMI_PICTURE_ASPECT_16_10
这样的变量,但在系统中并没有定义,这通常意味着需要手动定义它,或者检查是否有其他方式来表示宽高比。在Linux内核或设备驱动程序中,宽高比通常用于描述显示模式的特性。
解决方案
-
检查现有定义
- 首先,检查代码中是否已经有类似的宽高比定义。可能在某个头文件中已经定义了常用的宽高比常量。
- 搜索
HDMI_PICTURE_ASPECT_
或类似的宏定义,看看是否有其他宽高比(如HDMI_PICTURE_ASPECT_4_3
或HDMI_PICTURE_ASPECT_16_9
)已经定义。
-
手动定义宽高比
-
如果没有找到现有的定义,您可以手动添加一个。通常,宽高比可以用一个枚举或宏来表示。
-
在合适的头文件或源文件中添加定义,例如:
#define HDMI_PICTURE_ASPECT_16_10 2 // 假设使用数字2来表示16:10
-
或者,如果使用枚举类型:
typedef enum { HDMI_PICTURE_ASPECT_4_3 = 0, HDMI_PICTURE_ASPECT_16_9, HDMI_PICTURE_ASPECT_16_10, // 新增的16:10宽高比 } hdmi_picture_aspect_ratio_t;
-
-
使用合适的值
- 宽高比的具体值可能取决于系统的实现。在某些系统中,宽高比可能只是一个标识符,用于在内部处理时区分不同的比例。
- 如果只是需要表示宽高比而不涉及具体的计算,使用一个简单的枚举或宏就足够了。
-
更新代码
- 在添加或修改宽高比定义后,更新使用这些定义的代码部分。
- 确保所有使用
HDMI_PICTURE_ASPECT_16_10
的地方都正确引用了新的定义。
-
编译和测试
- 重新编译代码,确保没有编译错误。
- 在目标设备上测试,确保新的分辨率和宽高比设置正常工作。
注意事项
- 代码风格:遵循项目中现有的代码风格和约定来添加或修改定义。
- 文档:更新相关文档,说明新增的宽高比定义及其用途。
- 兼容性:确保修改不会影响其他现有的功能或定义。
如果您是在一个大型项目中工作,建议在修改前与团队成员或项目负责人沟通,以确保修改符合项目的整体规划和标准。
2.RK3588中,enum hdmi_picture_aspect的作用是什么
在RK3588中,enum hdmi_picture_aspect
是一个枚举类型,用于表示HDMI显示模式的宽高比(Aspect Ratio)。宽高比是指显示屏幕或图像宽度和高度之间的比例关系,对于确保图像在显示设备上正确显示至关重要。
具体来说,enum hdmi_picture_aspect
的作用可能包括但不限于以下几点:
-
标准化宽高比表示:
- 使用枚举类型可以确保宽高比的一致性和标准化表示。每个枚举值对应一个特定的宽高比,如16:9、4:3、16:10等。
-
内部处理:
- 在驱动程序或系统内部处理时,可以使用
enum hdmi_picture_aspect
来区分不同的显示模式。这有助于在配置显示参数、进行图像缩放或适配时,根据宽高比进行相应的处理。
- 在驱动程序或系统内部处理时,可以使用
-
配置显示参数:
- 当设置显示参数时,如分辨率、刷新率等,宽高比也是一个重要的考虑因素。通过指定
enum hdmi_picture_aspect
,可以确保显示设备以正确的宽高比显示图像。
- 当设置显示参数时,如分辨率、刷新率等,宽高比也是一个重要的考虑因素。通过指定
-
兼容性:
- 使用枚举类型表示宽高比可以提高代码的可读性和可维护性。此外,它还有助于确保代码与不同的显示设备和标准兼容。
在RK3588的HDMI显示相关代码中,enum hdmi_picture_aspect
可能被用于配置显示模式、处理图像数据、适配显示设备等场景。例如,在配置HDMI输出时,可能需要指定输出图像的分辨率和宽高比,以确保图像在显示设备上正确显示。
虽然无法直接查看RK3588的源代码以获取 enum hdmi_picture_aspect
的确切定义和用法,但根据一般经验和类似设备的处理方式,可以合理推测其在HDMI显示处理中的重要作用。如果您正在开发或维护RK3588相关的项目,建议查阅相关的文档、源代码或技术规格书,以获取更详细和准确的信息。
3.RK3588中,我如果添加一个一个新的宽高比,我还需要再添加什么才能保证这个宽高比的显示器能够正常显示
在RK3588中添加一个新的宽高比(Aspect Ratio)时,为了确保显示器能够正常显示,除了定义新的宽高比枚举值外,您可能还需要进行以下步骤:
1. 定义新的宽高比枚举值
首先,您需要在代码中定义新的宽高比枚举值。例如:
typedef enum {
HDMI_PICTURE_ASPECT_4_3,
HDMI_PICTURE_ASPECT_16_9,
HDMI_PICTURE_ASPECT_16_10,
HDMI_PICTURE_ASPECT_NEW_RATIO, // 新增的宽高比枚举值
} hdmi_picture_aspect_ratio_t;
2. 配置新的宽高比参数
在定义了新的宽高比枚举值后,您需要为新的宽高比配置相应的参数。这些参数可能包括:
- 水平像素数(hdisplay)
- 垂直像素数(vdisplay)
- 水平同步开始(hsync_start)
- 水平同步结束(hsync_end)
- 垂直同步开始(vsync_start)
- 垂直同步结束(vsync_end)
- 水平总像素数(htotal)
- 垂直总像素数(vtotal)
这些参数用于描述新的宽高比显示模式的时序和像素布局。您需要根据显示器的规格和HDMI标准来配置这些参数。
3. 更新HDMI驱动程序
在配置了新的宽高比参数后,您需要更新HDMI驱动程序以支持新的宽高比。这可能涉及修改HDMI驱动代码中的模式列表或配置结构,以包含新的宽高比。
4. 测试和验证
在完成了上述步骤后,您需要进行测试和验证,以确保新的宽高比能够正常显示。这可能涉及:
- 连接支持新宽高比的显示器
- 启动设备并检查显示器是否能够正确识别新的宽高比
- 验证图像质量、色彩和同步是否正常
5. 文档和支持
最后,您可能还需要更新相关的文档和支持信息,以告知用户和开发者如何使用新的宽高比。这可能包括:
- 用户手册
- 开发者文档
- 技术支持信息
注意事项
- 兼容性:在添加新的宽高比时,请确保它与现有的显示设备和标准兼容。
- 测试范围:尽可能在多种显示设备和配置下测试新的宽高比,以确保其稳定性和可靠性。
- 代码风格:遵循项目中的代码风格和命名约定,以保持代码的一致性和可维护性。
如果您不熟悉HDMI标准或RK3588的驱动开发,建议在有经验的开发者的指导下进行操作。同时,查阅相关的技术文档和规格书也是获取准确信息的重要途径。
4.3588 屏幕模式解析
{ DRM_MODE(DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
1480, 1680, 800, 803, 809, 831, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC),
.vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10,},
这段代码定义了一个显示模式,通常用于Linux内核的Direct Rendering Manager (DRM) 子系统中,特别是在处理视频输出时,比如通过HDMI接口。下面是这段代码的详细解释:
-
DRM_MODE(DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, 1480, 1680, 800, 803, 809, 831, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC)
:DRM_MODE_TYPE_DRIVER
: 指示这个模式是由驱动程序定义的,而不是标准模式。83500
: 是像素时钟频率,单位为kHz。这里表示像素时钟为83.5MHz。1280
: 水平有效像素数。1352
: 水平同步前沿开始位置。1480
: 水平同步脉冲结束位置。1680
: 水平总像素数,包括有效像素、同步脉冲和消隐区。800
: 垂直有效行数。803
: 垂直同步前沿开始行。809
: 垂直同步脉冲结束行。831
: 垂直总行数,包括有效行、同步脉冲和消隐区。0
: 通常是刷新率或保留字段,在这个上下文中为0,因为刷新率在后面的字段中单独指定。DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC
: 标志位,DRM_MODE_FLAG_NHSYNC
表示负水平同步(即同步脉冲在低电平),DRM_MODE_FLAG_PVSYNC
表示正垂直同步(即同步脉冲在高电平)。
-
.vrefresh = 60
: 刷新率设置为60Hz。 -
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10
: 图片宽高比设置为16:10,这是高清电视常见的宽高比。
综上所述,这段代码定义了一个1280x800分辨率、60Hz刷新率、像素时钟为83.5MHz、宽高比为16:10的显示模式,且使用负水平同步和正垂直同步信号。这样的模式通常用于高清视频输出,特别是在需要特定分辨率和刷新率的嵌入式系统或计算机图形输出场景中。
5.上面,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
。
请注意,由于内核源码的频繁更新和变化,具体的文件路径可能会随着时间而变化。因此,最可靠的方法是在你正在使用的特定内核版本和硬件平台的源码中搜索该常量。
6. 屏幕宽高比
enum hdmi_picture_aspect {
HDMI_PICTURE_ASPECT_NONE,
HDMI_PICTURE_ASPECT_4_3,
HDMI_PICTURE_ASPECT_16_9,
HDMI_PICTURE_ASPECT_64_27,
HDMI_PICTURE_ASPECT_256_135,
HDMI_PICTURE_ASPECT_RESERVED,
};
这个枚举类型 hdmi_picture_aspect
用于表示HDMI(高清多媒体接口)视频信号中的图像宽高比。每个枚举值代表一种特定的宽高比设置,下面是每个枚举值的解释:
-
HDMI_PICTURE_ASPECT_NONE
:无特定宽高比。这可能表示未设置宽高比或宽高比信息不可用。 -
HDMI_PICTURE_ASPECT_4_3
:4:3 宽高比。这是一种传统的电视屏幕宽高比,常见于旧式电视机和标准清晰度电视节目。 -
HDMI_PICTURE_ASPECT_16_9
:16:9 宽高比。这是高清电视(HDTV)和大多数现代宽屏显示器采用的宽高比,提供了更宽广的视野,适合电影和高清视频内容。 -
HDMI_PICTURE_ASPECT_64_27
:64:27 宽高比。这个比例较少见,但它可能用于某些特定的视频格式或显示需求。 -
HDMI_PICTURE_ASPECT_256_135
:256:135 宽高比。这个比例同样不常见,可能用于特定的高分辨率或专业视频应用。 -
HDMI_PICTURE_ASPECT_RESERVED
:保留值。这个枚举值被保留,可能用于未来扩展或特定用途,当前未定义具体的宽高比。
这些枚举值允许HDMI设备在传输视频信号时指定图像的宽高比,确保视频内容能够正确地在接收设备上显示,避免因宽高比不匹配而导致的图像变形或裁剪问题。
7.我如果在这个枚举中添加一个HDMI_PICTURE_ASPECT_16_20,来支持1280:800的显示器,还需要做哪些调整
enum hdmi_picture_aspect {
HDMI_PICTURE_ASPECT_NONE,
HDMI_PICTURE_ASPECT_4_3,
HDMI_PICTURE_ASPECT_16_9,
HDMI_PICTURE_ASPECT_64_27,
HDMI_PICTURE_ASPECT_256_135,
HDMI_PICTURE_ASPECT_RESERVED,
}
在枚举类型 hdmi_picture_aspect
中添加一个新的值 HDMI_PICTURE_ASPECT_16_20
以支持 1280:800 的显示器是一个合理的扩展,但要确保这个更改在整个系统中生效,你可能需要进行以下调整和验证:
- 更新枚举定义:
- 简单地在枚举中添加
HDMI_PICTURE_ASPECT_16_20
:enum hdmi_picture_aspect { HDMI_PICTURE_ASPECT_NONE, HDMI_PICTURE_ASPECT_4_3, HDMI_PICTURE_ASPECT_16_9, HDMI_PICTURE_ASPECT_64_27, HDMI_PICTURE_ASPECT_256_135, HDMI_PICTURE_ASPECT_16_20, // 新增的宽高比 HDMI_PICTURE_ASPECT_RESERVED, };
- 简单地在枚举中添加
- 更新相关代码逻辑:
- 模式设置:在代码中,任何使用
hdmi_picture_aspect
的地方都需要检查是否处理了新添加的HDMI_PICTURE_ASPECT_16_20
。特别是在设置显示模式或初始化显示参数时,确保新宽高比被正确识别和应用。 - 驱动支持:如果这是用于HDMI驱动,确保驱动代码中能够识别并正确处理
HDMI_PICTURE_ASPECT_16_20
。可能需要更新驱动的配置或模式设置函数。
- 模式设置:在代码中,任何使用
- 验证和测试:
- 功能测试:在支持1280x800分辨率的显示器上测试新的宽高比设置,确保图像显示正常,没有变形或裁剪。
- 兼容性测试:在其他分辨率和宽高比的显示器上测试,确保添加新枚举值没有引入兼容性问题。
- 文档更新:
- 更新相关开发文档或用户手册,说明新的宽高比支持及其用途。
- 代码审查和合并:
- 如果这是一个开源项目或团队项目,提交代码更改以供审查,并确保遵循项目的代码合并流程。
- 考虑协议和标准:
- 确保
16:20
(或简化为4:5
)作为一个非标准的宽高比在你的应用场景中是合理的,并且接收设备(如显示器或电视)能够理解和正确处理这个宽高比。
- 确保
通过这些步骤,你可以确保新添加的 HDMI_PICTURE_ASPECT_16_20
在系统中得到正确支持和应用。
8.异常分析
common/edid.c:825:43: 错误: ‘HDMI_PICTURE_ASPECT_16_10’ undeclared here (not in a function); did you mean ‘HDMI_PICTURE_ASPECT_16_9’?
825 | .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_10,},
| ^~~~~~~~~~~~~~~~~~~~~~~~~
|
这个错误信息表明在你的代码中,HDMI_PICTURE_ASPECT_16_10
没有被声明,编译器因此建议你是否是想使用 HDMI_PICTURE_ASPECT_16_9
。这通常意味着你在枚举中没有定义 HDMI_PICTURE_ASPECT_16_10
,但在代码中尝试使用它。
解决方案
- 检查枚举定义:
- 确保你的
hdmi_picture_aspect
枚举中确实包含了HDMI_PICTURE_ASPECT_16_10
。如果没有,你需要添加它。例如:enum hdmi_picture_aspect { HDMI_PICTURE_ASPECT_NONE, HDMI_PICTURE_ASPECT_4_3, HDMI_PICTURE_ASPECT_16_9, HDMI_PICTURE_ASPECT_16_10, // 确保这一行存在 HDMI_PICTURE_ASPECT_64_27, HDMI_PICTURE_ASPECT_256_135, HDMI_PICTURE_ASPECT_16_20, // 你之前想添加的 HDMI_PICTURE_ASPECT_RESERVED, };
- 确保你的
- 代码一致性:
- 确保所有使用
hdmi_picture_aspect
的地方都引用了正确的枚举值。如果你刚刚添加了HDMI_PICTURE_ASPECT_16_10
,检查所有相关文件以确保一致性。
- 确保所有使用
- 头文件包含:
- 确保定义了
hdmi_picture_aspect
的头文件被正确包含在使用它的文件中。如果枚举定义在一个头文件中,确保#include
了这个头文件。
- 确保定义了
- 重新编译:
- 在做出更改后,重新编译你的项目,确保所有更改都被正确应用。
- 检查拼写和大小写:
- C语言是区分大小写的,确保在代码中使用的枚举值与定义时的大小写一致。
如果你实际上是想使用 HDMI_PICTURE_ASPECT_16_9
而不是 HDMI_PICTURE_ASPECT_16_10
,那么你可以直接修改代码中的使用点为 HDMI_PICTURE_ASPECT_16_9
。但如果你确实需要 16:10
的宽高比支持,那么必须在枚举中定义它。