什么是 udlfb?¶
这是一个用于 DisplayLink USB 2.0 时代图形芯片的驱动程序。
DisplayLink 芯片提供简单的 hline/blit 操作和一些压缩,将其与 USB 线另一端的硬件帧缓冲(16MB)配对。在像素发生变化之前,该硬件帧缓冲能够驱动 VGA、DVI 或 HDMI 显示器,无需 CPU 参与。
CPU 或其他本地资源执行所有渲染;可选择将结果与远程硬件帧缓冲的本地阴影进行比较,以识别已更改的最小像素集;并通过 USB 批量传输逐行压缩和发送这些像素。
由于批量传输的效率以及顶部不需要任何确认的协议,因此效果是非常低的延迟,可以支持令人惊讶的高分辨率,并且对于非游戏和非视频应用程序具有良好的性能。
模式设置、EDID 读取等是其他批量或控制传输。模式设置非常灵活 - 能够从任何时序设置几乎任意的模式。
USB 图形的优点
能够向任何支持 USB 2.0 的系统添加几乎任意数量的显示器。在 Linux 上,显示器的数量受 fbdev 接口的限制(FB_MAX 当前为 32)。当然,同一主机控制器上的所有 USB 设备共享相同的 480Mbs USB 2.0 接口。
使用内核帧缓冲接口支持 DisplayLink 芯片的优点
DisplayLink 芯片的实际硬件功能与 fbdev 接口几乎一一对应,使得驱动程序相对于其提供的功能非常小且紧凑。
X 服务器和其他应用程序可以使用用户模式下的标准 fbdev 接口与设备通信,而无需了解任何关于 USB 或 DisplayLink 协议的信息。“displaylink” X 驱动程序和稍微修改过的“fbdev” X 驱动程序就是其中已经存在的。
缺点
Fbdev 的 mmap 接口假定映射了一个真实的硬件帧缓冲。对于 USB 图形,它只是一个分配的(虚拟)缓冲区。写入需要被 CPU 检测并编码为 USB 批量传输。准确的损坏/更改区域通知可以解决此问题。将来,希望 fbdev 将通过一个小型的标准接口进行增强,以允许 mmap 客户端报告损坏,以便虚拟或远程帧缓冲受益。
Fbdev 不能很好地仲裁客户端对帧缓冲的所有权。
Fbcon 假设它找到的第一个帧缓冲应该用于控制台。
考虑到 KMS/DRM 的兴起,fbdev 的未来尚不清楚。
如何使用它?¶
当作为模块加载时,Udlfb 将匹配所有 USB 2.0 代 DisplayLink 芯片(Alex 和 Ollie 系列)。然后,它将尝试读取显示器的 EDID,并在 DisplayLink 设备和显示器的功能之间设置最佳的公共模式。
如果 DisplayLink 设备成功,它将绘制一个“绿屏”,这意味着从硬件和 fbdev 软件的角度来看,一切都很好。
此时,将存在一个 /dev/fb? 接口,供用户模式应用程序打开并开始使用标准 fbdev 调用写入 DisplayLink 设备的帧缓冲。请注意,如果使用 mmap(),默认情况下,用户模式应用程序必须发送损坏通知以触发已更改区域的重绘。或者,可以重新编译 udlfb 并启用实验性的 defio 支持,以支持基于页面错误的检测机制,该机制可以在没有显式通知的情况下工作。
udlfb 最常见的客户端是 xf86-video-displaylink 或修改过的 xf86-video-fbdev X 服务器。这些服务器没有真正的 DisplayLink 特定代码。它们写入标准帧缓冲接口,并依靠 udlfb 来执行其操作。它们拥有的一个额外功能是能够通过 udlfb 的损坏接口将来自 X DAMAGE 协议扩展的矩形报告给 udlfb(希望这将成为所有需要损坏信息的虚拟帧缓冲的标准)。这些损坏通知使 udlfb 能够有效地处理已更改的像素。
模块选项¶
通常不需要对 udlfb 进行特殊配置。但是,有一些选项。
从命令行,将选项传递给 modprobe
modprobe udlfb fb_defio=0 console=1 shadow=1
或者通过编辑 /sys/module/udlfb/parameters/PARAMETER_NAME 来动态更改选项
cd /sys/module/udlfb/parameters
ls # to see a list of parameter names
sudo nano PARAMETER_NAME
# change the parameter in place, and save the file.
拔下并重新插入 USB 设备以应用新设置。
或者,要永久应用选项,请创建一个 modprobe 配置文件,例如 /etc/modprobe.d/udlfb.conf,其中包含文本
options udlfb fb_defio=0 console=1 shadow=1
接受的布尔选项
fb_defio |
利用 fb_defio (CONFIG_FB_DEFERRED_IO) 内核模块通过页面错误跟踪帧缓冲的更改区域。使用 mmap 但不报告损坏的标准 fbdev 应用程序应该能够在此启用时工作。当使用支持通过 ioctl 报告更改区域的 X 服务器运行时禁用,因为此方法更简单、更稳定且性能更高。默认值:fb_defio=1 |
console |
允许 fbcon 附加到 udlfb 提供的帧缓冲。如果 fbcon 和其他客户端(例如,带有 --shared-vt 的 X)发生冲突,则可以禁用此选项。默认值:console=1 |
shadow |
分配第二个帧缓冲以阴影 USB 总线上设备内存中当前的内容。如果任何像素未更改,则不传输。花费主机内存来节省 USB 传输。默认启用。仅在内存非常低的系统上禁用。默认值:shadow=1 |
Sysfs 属性¶
Udlfb 在 /sys/class/graphics/fb? 中创建多个文件。其中 ? 是特定 DisplayLink 设备的顺序帧缓冲 ID
edid |
如果将有效的 EDID blob 写入此文件(通常由 udev 规则),则 udlfb 将使用此 EDID 作为备份,以防读取连接到 DisplayLink 设备的显示器的实际 EDID 失败。这对于无法通过 EDID 传达其功能的固定面板等特别有用。读取此文件将返回连接的显示器的当前 EDID(或最后写入的备份值)。这对于获取连接的显示器的 EDID 非常有用,该 EDID 可以传递给 parse-edid 等实用程序。 |
metrics_bytes_rendered |
渲染的像素字节的 32 位计数 |
metrics_bytes_identical |
基于阴影帧缓冲检查,发现多少字节未更改的 32 位计数 |
metrics_bytes_sent |
通过 USB 传输的字节的 32 位计数,用于将生成的更改像素传达给硬件。包括压缩和协议开销 |
metrics_cpu_kcycles_used |
处理上述像素所使用的 CPU 周期(以千个周期为单位)的 32 位计数。 |
metrics_reset |
仅写入。写入此文件的任何内容都会将上述所有指标重置为零。请注意,上述 32 位计数器会很快溢出。为了获得可靠的结果,请设计性能测试以在非常短的时间内(一分钟或更短时间是安全的)开始和结束。 |
Bernie Thompson <bernie@plugable.com>