[Linux][RK3399] DRM HDMI 调试小结

本文档针对RK3399平台介绍如何解决HDMI显示器无法正确识别的问题,包括确认显示器EDID识别状态、使用模拟EDID文件进行调试等步骤,并提供了常见错误及解决方案。

Platform: RK3399
OS: Android 6.0
Kernel: 4.4
Version: v2017.04

调试流程

1. 确认板子是否识别到了显示器的 EDID

 echo 0x1f > /sys/module/drm/parameters/debug

插拔一下hdmi
然后dmesg | grep drm, 看看里面的信息是否解析到了edid

[  405.576876] EDID block is all zeroes
[  405.577224] rockchip-drm display-subsystem: HDMI-A-1: EDID block 0 invalid.
[  405.687232] EDID block is all zeroes
[  405.687590] rockchip-drm display-subsystem: HDMI-A-1: EDID block 0 invalid.

EDID = 0
这个就是显示器被识别为DVI的主因, 当无法读出edid时, hdmi驱动可能就会以dvi显示输出

2. 测一下hdmi驱动是否可以支持hdmi输出

使能 CONFIG_DRM_LOAD_EDID_FIRMWARE
(参考 https://markyzq.gitbooks.io/rockchip_drm_integration_helper/content/zh/drm_config_load_firmware.html

acer_edid.bin :http://download.youkuaiyun.com/download/dearsq/9905985

将附件的 acer_edid.bin 推到板子上, 以下是android上的例子, linux上也可以进行类似操作

adb push acer_edid.bin /data
adb shell:
   mount -o rw,remount /
   cp /data/acer_edid.bin /lib/firmware/
   echo HDMI-A-1:acer_edid.bin > /sys/module/drm_kms_helper/parameters/edid_firmware

采用 acer_edid.bin 模拟 EDID 后分辨率由 DVI 800×600@60HZ 变为 DVI 1920×1080@60HZ 。但是依旧无法识别 HDMI。
热插拔信息:

[  211.948958] [drm:edid_load] Got external EDID base block and 1 extension from "acer_edid.bin" for connector "HDMI-A-1"
[  211.949953] [drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid, remainder is 4
[  212.066567] [drm:edid_load] Got external EDID base block and 1 extension from "acer_edid.bin" for connector "HDMI-A-1"
[  212.067598] [drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid, remainder is 4

错误信息

1. No drm_driver.set_busid() implementation provided by 0x…. Use drm_dev_set_unique() to set the unique

1)dev->driver->set_busid 回调没有被赋值
2)dev->unique == NULL

set_busid 没有对应回调是正常的,RK 平台未对其进行实现,一般在 PC 平台会对其进行实现。

dev->unique == NULL 不正常。
RK VR SDK 中 DRM 框架太旧了,通过升级 DRM 框架解决。

2. drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c:64:2: error: unknown field ‘fb_dmabuf_export’ specified in initializer

.fb_dmabuf_export = rockchip_fbdev_get_dma_buf,

/home/younix/rk_op_linux_3399/kernel/include/linux/fb.h

/* Export the frame buffer as a dmabuf object */
struct dma_buf *(*fb_dmabuf_export)(struct fb_info *info);

3. kernel/drivers/gpu/drm/drm_prime.c:545: undefined reference to ‘dma_buf_get_release_callback_data’

需要对比修改 文件:/home/younix/rk_op_linux_3399/kernel/drivers/dma-buf/dma-buf.c

参考资料

Kernel Doc
https://www.kernel.org/doc/htmldocs/drm/
The DRM/KMS subsystem from a newbie’s point of view
http://events.linuxfoundation.org/sites/events/files/slides/brezillon-drm-kms.pdf
DRM Maintainer 总结的资料:https://markyzq.gitbooks.io/rockchip_drm_integration_helper/content/zh/

### 在 RK3568 平台上的 Debian 系统中安装 RTL8821 驱动程序 为了在 RK3568 平台上成功配置并加载 RTL8821CS Wi-Fi 驱动,以下是详细的说明: #### 1. 准备工作环境 确保开发板已运行稳定的 Debian 系统,并具备编译内核模块所需的工具链。可以通过以下命令安装必要的依赖项: ```bash sudo apt update && sudo apt install build-essential bc kmod libelf-dev ``` #### 2. 获取驱动源码 根据描述,RTL8821CS 的驱动应放置于指定路径 `kernel/drivers/net/wireless/rockchip_wlan/rtl8821cs`[^2]。如果该目录不存在,则需手动下载驱动源码。 可以从 Realtek 官方或其他可信资源获取最新版本的 RTL8821CS 驱动代码。假设已经获得驱动源码压缩包(如 `rtl8821cu.zip`),解压至目标位置: ```bash unzip rtl8821cu.zip -d /path/to/kernel/drivers/net/wireless/rockchip_wlan/ mv /path/to/kernel/drivers/net/wireless/rockchip_wlan/rtl8821cu /path/to/kernel/drivers/net/wireless/rockchip_wlan/rtl8821cs ``` #### 3. 修改内核配置 编辑 `.config` 文件以启用 RTL8821CS 支持。具体操作如下: - 打开默认配置文件 `/path/to/kernel/arch/arm64/configs/rockchip_linux_defconfig`。 - 添加或确认存在以下选项: ``` CONFIG_RTL8821CU=m ``` 重新生成内核配置: ```bash make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_linux_defconfig ``` #### 4. 编译与安装驱动模块 进入驱动所在目录并执行编译过程: ```bash cd /path/to/kernel/drivers/net/wireless/rockchip_wlan/rtl8821cs make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- sudo make INSTALL_MOD_PATH=/modules/path modules_install ``` 将生成的模块复制到适当的位置: ```bash cp *.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/rockchip_wlan/rtl8821cs/ depmod -a ``` #### 5. 加载驱动模块 通过以下命令动态加载驱动模块: ```bash sudo modprobe 8821cu ``` 验证模块是否正常加载: ```bash lsmod | grep 8821cu ``` #### 6. 设置开机自动加载 创建一个新的服务脚本以便在系统启动时自动加载驱动模块。例如,在 `/etc/systemd/system/rtl8821cs.service` 中定义: ```ini [Unit] Description=Load RTL8821CS WiFi driver at boot time [Service] Type=oneshot ExecStart=/sbin/modprobe 8821cu [Install] WantedBy=multi-user.target ``` 激活服务: ```bash sudo systemctl enable rtl8821cs.service sudo systemctl start rtl8821cs.service ``` --- ### 注意事项 - 如果遇到兼容性问题,请尝试更新驱动源码至最新版本。 - 对于特定硬件平台(如 RK3568),可能需要调整某些参数以适配其架构特性[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值