5.15.32内核 DRM_IOCTL_WAIT_VBLANK被移除了吗
时间: 2023-07-21 17:47:52 浏览: 189
根据我的了解,DRM_IOCTL_WAIT_VBLANK是一个等待垂直同步信号的DRM设备驱动程序IOCTL命令,它用于协调显示输出和应用程序的渲染。在Linux内核5.15.32中,该命令未被移除。实际上,DRM_IOCTL_WAIT_VBLANK是DRM设备驱动程序的核心命令之一,通常用于游戏、视频播放和其他需要同步渲染的应用程序。因此,建议您可以继续使用DRM_IOCTL_WAIT_VBLANK命令。如果您有更多的疑问,建议您查阅相关的内核文档或咨询内核开发人员以获取更准确的答案。
相关问题
5.15.32内核 drm示例代码
以下是一个简单的用户空间程序,用于接收5.15.32版本内核上报的vblank事件。该程序使用DRM库中提供的函数来实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <drm/drm.h>
#include <drm/drm_mode.h>
int main()
{
int fd;
int ret;
uint64_t cap_value = 1;
uint64_t handle;
struct drm_event_vblank event;
fd_set fds;
fd = open("/dev/dri/card0", O_RDWR);
if (fd < 0) {
perror("open");
exit(1);
}
// 请求事件句柄
ret = ioctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap_value);
if (ret < 0) {
perror("DRM_IOCTL_SET_CLIENT_CAP");
exit(1);
}
// 等待第一个vblank事件
ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK_EVENT, &handle);
if (ret < 0) {
perror("DRM_IOCTL_WAIT_VBLANK_EVENT");
exit(1);
}
while (1) {
FD_ZERO(&fds);
FD_SET(fd, &fds);
// 等待事件的发生
ret = select(fd + 1, &fds, NULL, NULL, NULL);
if (ret < 0) {
perror("select");
exit(1);
}
// 读取事件数据
ret = read(handle, &event, sizeof(event));
if (ret < 0) {
perror("read");
exit(1);
}
// 处理事件
printf("Got vblank event %d\n", event.sequence);
// 再次等待vblank事件
ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK_EVENT, &handle);
if (ret < 0) {
perror("DRM_IOCTL_WAIT_VBLANK_EVENT");
exit(1);
}
}
close(fd);
return 0;
}
```
这个程序会不断等待vblank事件的发生,并在事件发生时打印事件序列号。可以使用Ctrl+C来停止程序的运行。需要注意的是,这个程序只是一个演示,实际应用中需要根据具体需求进行修改。
drmHandleEvent被移除出5.15.32内核了吗
根据我查阅的资料,drmHandleEvent()函数从Linux 5.1版本开始已经被移除。在该版本之后,内核提供了新的机制来管理事件句柄,以及与用户空间进行通信。这个新的机制是通过DRM_IOCTL_SET_CLIENT_CAP和DRM_IOCTL_GET_CAP ioctl()调用来实现的。
具体来说,用户空间可以使用DRM_IOCTL_SET_CLIENT_CAP ioctl()调用来请求内核为该客户端分配一个事件句柄。内核会将事件句柄作为响应返回给用户空间。然后,用户空间可以使用DRM_IOCTL_WAIT_VBLANK_EVENT ioctl()调用等待vblank事件的发生,并将事件句柄作为参数传递给内核。在事件发生时,内核会将事件数据打包成一个结构体,通过事件句柄发送给用户空间。用户空间可以使用read()系统调用从事件句柄读取事件数据。
需要注意的是,DRM_IOCTL_SET_CLIENT_CAP和DRM_IOCTL_WAIT_VBLANK_EVENT ioctl()调用需要有足够的权限才能执行。在使用这些ioctl()调用时,可以参考DRM库中提供的示例代码来实现。
阅读全文