drm设备不工作

在升级内核后,遇到drm设备无法正常工作,表现为缺少fb0设备且启动无drm相关信息。通过检查设备树和内核驱动,确认SUN4I驱动已启用,但问题仍未解决。进一步通过设置drm.debug获取更详细日志,发现内核错误地尝试挂载/panel节点。解决方法是修改suniv_quirks,添加has_channel_0配置,并屏蔽.has_channel_1,最终使drm成功启动。
AI助手已提取文章相关产品:

在设备升级新版内核后,发现没有 fb0 设备,开机没有打印 drm 相关的信息

首先是检查设备树,确认加入 panel 节点

panel: panel {
		compatible = "lg,lb070wv8”, “simple-panel";
		#address-cells = <1>;
		#size-cells = <0>;
		enable-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			panel_input: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&tcon0_out_lcd>;
			};
		};
	};

其次是检查内核是否开启了相关的驱动,这里使用的是 lichepi nano,依赖的驱动是 SUN4I 系列的驱动

CONFIG_DRM_SUN4I=y
CONFIG_DRM_SUN4I_HDMI=y
CONFIG_DRM_SUN4I_BACKEND=y

不过在检查完上面两个地方没有问题后,还是没有解决问题

为了获取 drm 启动过程中的更多信息,在 uboot 的 bootargs 中加入 drm.debug=0x1f debug ,让内核打印 drm 的更多信息

[    1.079849] [drm:drm_core_init] Initialized
[    1.084524] [drm:sun4i_drv_probe] Adding component /soc/display-backend@1e60000
[    1.092143] [drm:sun4i_drv_probe] Adding component /soc/lcd-controller@1c0c000
[    1.099606] [drm:sun4i_drv_probe] Adding component /panel
[    1.105025] [drm:sun4i_drv_traverse_endpoints] No output to bind on port 1
[    1.124695] [drm:compare_of] Comparing of node /soc/lcd-controller@1c0c000 with /soc/display-backend@1e60000
...

发现内核尝试着挂载 /panel 节点,这个本来是不用挂载的

修改 suniv_quirks,加上 has_channel_0 的配置。缺少 has_channel_0 会让内核认为这个 TCON 没有 RGB 口

static const struct sun4i_tcon_quirks suniv_quirks = {
    .has_channel_0		= true,
	.has_channel_1		= true,
};

重新编译烧录后,drm 的启动信息如下。内核没有再去挂载 /panel 节点了,不过 drm 的启动还是没有成功

[    1.079943] [drm:drm_core_init] Initialized
[    1.084616] [drm:sun4i_drv_probe] Adding component /soc/display-backend@1e60000
[    1.092235] [drm:sun4i_drv_probe] Adding component /soc/lcd-controller@1c0c000
[    1.099662] [drm:sun4i_drv_traverse_endpoints] Endpoint is our panel... skipping
[    1.121843] [drm:compare_of] Comparing of node /soc/display-backend@1e60000 with /soc/display-backend@1e60000
[    1.131931] [drm:compare_of] Comparing of node /soc/display-backend@1e60000 with /soc/lcd-controller@1c0c000

后来在看到了这份 commit 中说的内容,将 .has_channel_1 屏蔽掉,drm 正常工作了

static const struct sun4i_tcon_quirks suniv_f1c100s_quirks = {
	/*
	 * The F1C100s SoC has a second channel in TCON, but the clock input of
	 * it is not documented.
	 */
	.has_channel_0		= true,
	/* .has_channel_1	= true, */
};

感谢

非常感谢这两位大神给我的帮助

您可能感兴趣的与本文相关内容

<think>好的,用户现在的问题是“内核中没有drm设备怎么办”。我需要先回顾之前的对话历史,看看用户之前问了什么,以及我的回答内容。之前用户询问了显示GPU的DRM如何工作,我详细介绍了DRM的初始化、模式设置、内存管理和安全性。现在用户可能遇到了系统内核中没有检测到DRM设备的问题,想知道如何解决。 首先,我需要分析可能的原因。内核中没有drm设备可能有多种情况,比如驱动未加载、硬件支持、内核配置问题或者硬件故障。用户可能是Linux系统用户,可能在安装或配置显卡驱动时遇到了问题,或者升级内核后出现了兼容性问题。 接下来,我需要考虑如何结构化回答。用户需要逐步排查问题,所以应该分步骤说明解决方法。例如,检查驱动是否加载,确认硬件支持,检查内核配置,查看系统日志,手动加载模块,编译或安装驱动,以及检查硬件连接。每个步骤需要简明扼要,给出具体的命令或方法,方便用户操作。 同时,用户可能对Linux命令行有一定了解,但可能熟悉具体的模块管理和日志查看命令,所以需要提供具体的命令示例,比如lsmod、dmesg、modprobe等。此外,用户可能需要知道如何检查内核配置,可能需要引导他们查看/boot/config文件或使用make menuconfig等方法。 还需要注意潜在的问题,比如开源驱动和闭源驱动的区别,比如NVIDIA的nouveau和官方驱动的差异。如果用户使用的是较新的显卡,可能需要安装更新的驱动版本,或者内核版本过旧支持该硬件,这时候可能需要升级内核。 此外,用户可能遇到硬件未正确连接的情况,比如显卡松动或显示器线缆问题,虽然这种情况较少,但也需要提醒用户检查硬件连接。 最后,需要总结可能的情况,并建议用户根据具体硬件和系统环境选择解决方案,如果自行无法解决,建议寻求社区或厂商支持。要确保回答清晰,步骤明确,帮助用户逐步排查问题,同时避免使用过于专业的术语,保持易懂。</think>如果在内核中未检测到DRM设备(如`/dev/dri/card*`缺失),可能由驱动未加载、硬件兼容或内核配置问题导致。以下是逐步排查和解决方法: --- ### **1. 检查驱动是否加载** #### 步骤: - **查看已加载的GPU驱动模块**: ```bash lsmod | grep -E "drm|i915|amdgpu|nouveau|radeon" ``` - **常见驱动模块**: - Intel集成显卡:`i915` - AMD显卡(较新):`amdgpu` - AMD旧显卡:`radeon` - NVIDIA开源驱动:`nouveau` - **若驱动未加载,手动加载**: ```bash sudo modprobe <驱动模块名> # 例如:sudo modprobe amdgpu ``` #### 可能问题: - 驱动未安装(如闭源驱动NVIDIA需手动安装)。 - 内核版本过低,支持当前硬件。 --- ### **2. 确认硬件是否被识别** #### 步骤: - **检查PCI设备信息**: ```bash lspci -k | grep -i vga ``` - 输出应显示显卡型号及当前绑定的驱动(如`Kernel driver in use: amdgpu`)。 - **若硬件未识别**: - 检查主板PCIe插槽是否接触良。 - 尝试在其他系统上测试显卡。 --- ### **3. 检查内核配置** #### 步骤: - **查看内核是否启用DRM支持**: ```bash grep CONFIG_DRM /boot/config-$(uname -r) ``` - 输出应为`CONFIG_DRM=y`,若为`n`表示内核未编译DRM支持。 - **若内核未配置DRM**: - 重新编译内核时启用以下选项: ```text CONFIG_DRM=y CONFIG_DRM_<厂商>=y # 如CONFIG_DRM_AMDGPU=y ``` --- ### **4. 查看系统日志** #### 步骤: - **通过`dmesg`排查错误**: ```bash dmesg | grep -i "drm\|gpu\|failed" ``` - 常见错误示例: - `Failed to load firmware "amdgpu/...": -2` → 缺失固件文件。 - `No supported devices found` → 驱动与硬件兼容。 --- ### **5. 安装缺失的固件或驱动** #### 场景: - **固件缺失**(常见于AMD/NVIDIA显卡): ```bash sudo apt install firmware-amd-graphics # Debian/Ubuntu sudo dnf install linux-firmware # Fedora ``` - **闭源驱动安装**(如NVIDIA): ```bash sudo ubuntu-drivers autoinstall # Ubuntu自动安装 sudo dnf install akmod-nvidia # Fedora ``` --- ### **6. 手动生成DRM设备节点** #### 步骤: - 加载驱动后,手动创建设备文件: ```bash sudo mknod /dev/dri/card0 c 226 0 # 主设备号226,次设备号0 sudo chmod 666 /dev/dri/card0 # 设置权限 ``` --- ### **7. 其他可能原因** - **Secure Boot干扰**:禁用Secure Boot(部分驱动需签名验证)。 - **内核模块黑名单**:检查`/etc/modprobe.d/`下是否有黑名单文件屏蔽了驱动。 --- ### **总结** - **典型解决流程**: 1. 确认硬件识别 → 2. 加载驱动 → 3. 检查固件/内核配置 → 4. 修复日志中的错误。 - **若仍无法解决**:尝试升级内核或使用厂商提供的专有驱动(如NVIDIA官方驱动)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值