Xorg 配置与 modesetting 驱动详解:从设备节点到显示旋转
一、Xorg 配置的整体框架
Xorg 是 Linux 下常见的图形显示服务器,它的配置文件通常位于 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/*.conf。
配置文件由多个 Section 组成,每个 Section 定义不同的组件:
- Section "Device" → 显卡驱动与参数
- Section "Monitor" → 显示器属性(分辨率、旋转等)
- Section "Screen" → 将 Device 与 Monitor 绑定,形成一个可用的屏幕
- Section "ServerLayout" → 定义整体布局
- Section "InputDevice" → 输入设备配置
👉 Xorg 配置是总框架,不同驱动(modesetting、fbdev、intel、amdgpu 等)都在这个框架里配置。
二、modesetting 驱动的角色
在现代 Linux 系统中,显卡驱动通常通过 DRM/KMS 接口 与内核交互。Xorg 提供了一个通用的驱动:modesetting_drv.so ,它可以绑定到任何支持 KMS 的设备节点(如 /dev/dri/card0)。
在 ARM/Rockchip/Mali 平台上,通常没有专有的 Xorg 驱动,所以 Xorg 的显卡部分就是 modesetting。
三、设备节点的对应关系
在 /dev/dri/ 下,你会看到多个设备节点:
- card0 → display-subsystem → modesetting → 显示输出
- card2 → Mali GPU (panthor) → Mesa → 3D 渲染
- card1 → NPU → 不参与显示
因此:
- 显示输出 → card0 + modesetting
- GPU 渲染 → card2 + panthor
- 两者协同完成整个图形栈。
四、modesetting 驱动支持的配置选项
根据源码中的 OptionInfoRec Options[],完整的可配置内容如下:
| 选项名 | 类型 | 作用说明 |
|---|---|---|
| SWcursor | Boolean | 使用软件光标而不是硬件光标 |
| kmsdev | String | 指定 DRM 设备节点,例如 /dev/dri/card0 |
| ShadowFB | Boolean | 启用 Shadow Framebuffer(CPU 内存中的缓冲区) |
| AccelMethod | String | 指定加速方式,常用 "glamor" 或 "none" |
| PageFlip | Boolean | 启用 page flipping,提高性能和流畅度 |
| ZaphodHeads | String | 多屏幕支持,指定输出头 |
| DoubleShadow | Boolean | 启用双 shadow buffer |
| Atomic | Boolean | 启用 atomic 模式设置(更现代的 KMS API) |
| VariableRefresh | Boolean | 启用 VRR/FreeSync |
| UseGammaLUT | Boolean | 使用 gamma LUT |
| AsyncFlipSecondaries | Boolean | 异步翻页辅助输出 |
| FlipFB | String | 指定翻页 framebuffer |
| MaxFlipRate | Integer | 最大翻页速率 |
| BindCurrent | Boolean | 绑定当前 GPU 上下文 |
| NoEDID | Boolean | 禁用 EDID 读取 |
| HotplugReset | Boolean | 热插拔时重置设备 |
| WarmUp | Boolean | 启用预热机制 |
| VirtualSize | String | 指定虚拟屏幕大小 |
| Padding | String | 指定填充参数 |
五、PrimaryGPU 与 kmsdev 的区别
- kmsdev → 驱动级别,强制绑定某个
/dev/dri/cardX。 - PrimaryGPU → 全局级别,告诉 Xorg 在多 GPU 环境下哪个设备是主显卡。
实际影响
- 如果已经指定了
kmsdev,显示输出一定走指定的设备,不受 PrimaryGPU 影响。 - 在多 GPU 环境下,
PrimaryGPU可以避免 Xorg 自动探测时选错设备(比如误选 NPU)。 - 因此:
- 单 GPU → 只用
kmsdev就够。 - 多 GPU → 建议同时加上
PrimaryGPU,保证全局逻辑一致。
- 单 GPU → 只用
六、Monitor 旋转相关配置
旋转逻辑在 Xorg 的 Crtc 层 (xf86Crtc.c)里实现,属于 Monitor/Screen 配置的一部分。
在配置文件中,可以通过 Monitor Section 来指定旋转方向:
ini
Section "Monitor"
Identifier "HDMI-1"
Option "Rotate" "left"
EndSection
可选值:
"normal"→ 默认方向"left"→ 向左旋转 90°"right"→ 向右旋转 90°"inverted"→ 旋转 180°
如果启用了 ShadowFB,旋转时会用 shadow buffer 来做拷贝和转换。
七、日志中的重复加载与错误
在 Xorg 日志中,你可能看到多次加载 modesetting 或尝试加载 fbdev。这是因为:
- Xorg 会自动匹配驱动,尝试 modesetting → fbdev → fallback。
- fbdev 在现代系统里通常不存在,所以报错
(EE) Failed to load module "fbdev"。 - 最终只会使用 modesetting 驱动绑定到 card0。
报错 Cannot run in framebuffer mode 的原因是 没有指定 BusID/kmsdev ,导致 Xorg误判为 framebuffer 模式。解决办法就是在配置里明确指定 kmsdev 或 PrimaryGPU。